计数posix read()接收的字节数

时间:2015-06-23 11:59:14

标签: c function serial-port posix

我对一行代码感到困惑:

temp_uart_count = read(VCOM, temp_uart_data, 4096); 

我在http://linux.die.net/man/3/read找到了更多有关读取函数的信息,但是如果一切正常,它会返回0,那么我们如何从中获取数字?

temp_uart_count用于计算从虚拟COM端口收到的字节数,并将其存储到temp_uart_data,宽度为4096字节。

我真的得到了这行代码收到的字节数吗?

3 个答案:

答案 0 :(得分:0)

是的,temp_uart_count将包含读取的实际字节数,显然该数字将小于或等于temp_uart_data的元素数。如果得到0,则表示已达到文件结尾(或等效条件),并且没有其他内容可供阅读。

如果它返回-1,则表示发生了错误,并且您需要检查errno变量以了解发生的情况。

答案 1 :(得分:0)

ssize_t read(int fd, void *buf, size_t count);返回他读取的字节大小,并将其存储在参数中传递的值中。当错误发生时,它返回-1(将errno设置为EINTR)或返回已读取的字节数。

来自linux的人:

On files that support seeking, the read operation commences at the current file offset, and the file offset is incremented by the number of bytes read. If the current file offset is at or past the end of file, no bytes are read, and read() returns zero.

答案 2 :(得分:0)

  

...但是如果一切正常,它会返回0,那么我们如何从中获取数量的字节?

返回代码为零只表示 read()无法提供任何数据。

  

我真的得到了这行代码收到的字节数吗?

是的, read()的正返回码(即> = 0)是缓冲区中返回的准确字节数。零是有效计数。

如果您需要更多数据,只需重复读取()系统调用。 (但是您可能设置 termios 参数很差,例如VMIN = 0且VTIME = 0)。

  

并且 - 零表示文件结束

     

如果你得到0,则表示已达到文件结尾(或等效条件),没有其他内容可供阅读。

以上(评论中的一个,答案中的另一个)不正确 从tty设备(例如,串行端口)读取不像从块设备上的文件读取,而是暂时的。读取数据仅在通过comm链接接收时可用。

当没有可用数据时,非阻止 read()将返回-1, errno 将设置为 EAGAIN

当没有可用数据时,阻止非规范 read()将返回零。将 termios 配置与this相关联,以确认返回零有效(并且不表示“文件结尾”)。

在任何一种情况下,都可以重复读取(),以便在/到达时获取更多数据。
此外,当使用非规范(也称为原始)模式(或非阻塞读取)时,不要期望或依赖 read()来为您执行消息或数据包管理。您需要在程序中添加一个层来读取字节,将这些字节连接成一个完整的消息数据报/数据包,并在处理该消息之前对其进行验证。