【问题标题】:Read/write into a device in C++在 C++ 中读取/写入设备
【发布时间】:2011-06-29 19:00:09
【问题描述】:

如何在 C++ 中读取/写入设备?设备位于/dev/ttyPA1
我考虑过 fstream,但我不知道设备是否有输出,我可以在不阻塞应用程序的情况下读取。
我的目标是创建和应用程序,您可以在终端中写入一些内容并将其发送到/dev/ttyPA1。如果设备有要写回的内容,它将从设备中读取并写入屏幕。如果不是,它将提示用户再次写入设备。
我该怎么做?

【问题讨论】:

  • 它是什么类型的设备?您是否应该使用open() 和朋友?
  • 如果它重要的话,它是一个 PWM 控制器

标签: c++ io device


【解决方案1】:

使用open(2)read(2)write(2) 读取和写入设备(完成后不要忘记close(2))。您还可以使用 C stdio 函数(fopen(3) 和朋友)或 C++ fstream 类,但如果这样做,您几乎肯定要禁用缓冲(setvbuf(3) 用于 stdio,或outFile.rdbuf()->pubsetbuf(0, 0) 用于 fstream)。

然而,这些都将在阻塞模式下运行。您可以使用select(2) 来测试是否可以在不阻塞的情况下读取或写入文件描述符(如果不可能,则不应这样做)。或者,您可以在文件描述符上使用O_NONBLOCK 标志打开文件(或在打开后使用fcntl(2) 设置标志),使其成为非阻塞;然后,对 read(2)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

【讨论】:

    【解决方案2】:

    您可以使用fstream,但您必须查看设备接收数据的规范。某些设备使用 ASCII 数据就可以了,而其他设备则需要特定的二进制数据位/字节序列。您可能还必须为您尝试写入的数据编写自定义序列化对象,使operator&lt;&lt;operator&gt;&gt; 函数重载。要么这样,要么您可以使用read()write() 方法从/向您在程序中分配的缓冲区数组读取/写入原始二进制数据。

    编辑:如果您担心阻止行为,那么您有两种选择。您将不得不使用 POSIX API,并使用poll()select() 检查打开的文件描述符以查看数据是否可用,或者您必须将任何文件写入或读取调用保留在一组基本上可以充当异步读/写操作的单独线程。因此,您基本上会向读取器/写入器线程发送一条消息,如果需要 fstream 调用,该线程将阻塞,但您的程序的其余部分可以继续运行。虽然您的程序可能不是为线程设计的,但如果是这种情况,那么 POSIX API 将是唯一可行的方法。

    【讨论】:

    • 它的二进制数据,我知道协议,但它没有指定它发回多少字节,所以我需要知道我是否可以读取以及读取多少。
    • 好吧,您可以使用fstream::read() 取回字节,并将其加载到内部分配的缓冲区中......基本上与您在C 中使用read() 和文件的方法相同-使用open()分配的描述符。否则,您可以创建一些管理它自己的内部内存缓冲区的对象,并重载 operator&gt;&gt; 函数以使用您的自定义读取器对象。
    • 问题是没有读的会阻塞,没有读的就不用读了。
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2021-01-29
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多