如何在C ++中读取/写入设备?设备位于/dev/ttyPA1
我想到了fstream,但我不知道设备是否有输出我可以在不阻止应用程序的情况下阅读
我的目标是创建和应用您在终端中写入内容并将其发送到/dev/ttyPA1
的位置。如果设备有回写的东西,它将从设备读取并写入屏幕。如果不是,它将给用户提示再次写入设备
我怎么能这样做?
答案 0 :(得分:6)
使用open(2)
,read(2)
和write(2)
来读取和写入设备(完成后不要忘记close(2)
)。您也可以使用C stdio函数(fopen(3)
和朋友)或C ++ fstream类,但如果这样做,您几乎肯定要禁用缓冲(setvbuf(3)
用于stdio或{{1}对于fstreams来说。)
然而,这些都将在阻止模式下运行。您可以使用select(2)
来测试是否可以在不阻塞的情况下读取或写入文件描述符(如果不可能,则不应该这样做)。或者,您可以在文件描述符上使用outFile.rdbuf()->pubsetbuf(0, 0)
标志打开文件(或使用fcntl(2)
在打开后设置标志)以使其无阻塞;然后,对O_NONBLOCK
或read(2)
的任何阻止的调用都会立即失败并显示错误write(2)
。
例如:
EWOULDBLOCK
答案 1 :(得分:0)
您可以使用fstream
,但是您必须查找设备希望如何接收数据的规范。有些设备可以很好地使用ASCII数据,其他设备则需要特定的二进制数据位/字节序列。您可能还必须编写自定义序列化对象,这些对象会使您尝试编写的数据的operator<<
和operator>>
函数重载。或者,您可以使用read()
和write()
方法从/向您在程序中分配的缓冲区数组中读取/写入原始二进制数据。
修改:如果您担心阻止行为,那么您有两种选择。您将需要使用POSIX API,并使用poll()
或select()
检查打开的文件描述符,以查看数据是否可用,或者您必须保留任何文件写入或读取调用在一组单独的线程中,基本上可以充当异步读/写操作。因此,您基本上会向读取器/写入器线程发送一条消息,如果fstream
调用需要,该线程将阻塞,但程序的其余部分可以继续运行。您的程序可能不是为线程设计的,如果是这种情况,那么POSIX API将是唯一的方法。