如何用 C++ 读取/写入设备?该设备位于/dev/ttyPA1
.
我考虑过 fstream,但我不知道设备是否具有我可以在不阻塞应用程序的情况下读取的输出。
我的目标是创建一个应用程序,您可以在终端中写入一些内容,然后将其发送到/dev/ttyPA1
。如果设备有需要写回的内容,它将从设备中读取并写入屏幕。如果没有,它将提示用户再次写入设备。
我怎样才能做到这一点?
Use open(2) http://linux.die.net/man/2/open, read(2) http://linux.die.net/man/2/read, and write(2) http://linux.die.net/man/2/write读取和写入设备(并且不要忘记close(2) http://linux.die.net/man/2/close当你完成时)。您还可以使用 C stdio 函数(fopen(3) http://linux.die.net/man/3/fopen和朋友)或 C++ fstream 类,但如果你这样做,你几乎肯定想要禁用缓冲(setvbuf(3) http://linux.die.net/man/3/setvbuf对于 stdio,或outFile.rdbuf()->pubsetbuf(0, 0)
对于 fstream)。
这些都将在blocking然而,模式。您可以使用select(2) http://linux.die.net/man/2/select测试是否可以在不阻塞的情况下读取或写入文件描述符(如果不可能,则不应这样做)。或者,您可以使用以下命令打开文件O_NONBLOCK
标志(或使用fcntl(2) http://linux.die.net/man/2/fcntl打开后在文件描述符上设置标志以使其非阻塞;然后,任何呼叫read(2)
or write(2)
这会阻塞而不是立即失败并出现错误EWOULDBLOCK
.
例如:
// Open the device in non-blocking mode
int fd = open("/dev/ttyPA1", O_RDWR | O_NONBLOCK);
if(fd < 0)
; // handle error
// Try to write some data
ssize_t written = write(fd, "data", 4);
if(written >= 0)
; // handle successful write (which might be a partial write!)
else if(errno == EWOULDBLOCK)
; // handle case where the write would block
else
; // handle real error
// Reading data is similar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)