Linux串口问题

时间:2011-10-08 01:11:42

标签: linux serial-port

我正在编写代码,以便通过Linux中的串口与另一台设备进行通信

即使0个字符到达,我希望非阻塞超时。 termios结构允许您设置VTIME和VMIN,但如果VMIN大于0,并且如果返回0个字符,则读取调用将永远阻止... WTF,为什么。这似乎不包括其他设备在短时间内停机的情况,现在我的应用程序在读取呼叫时被阻止。这似乎是一种忽视的批判行为。我真的不想实现自己的超时。

Write command
Read block timeout of around .3s(if 0 characters, still wait max of .3s)

2 个答案:

答案 0 :(得分:2)

如果您希望read在超时后没有数据返回,您可以设置MIN == 0TIME > 0。来自tcsetattr(3)

  

MIN == 0;时间> 0:TIME指定计时器的限制,以十分之一为单位   一秒。调用read(2)时启动定时器。 (2)读   当至少有一个字节的数据可用时,或者何时返回   计时器到期。如果计时器到期而没有任何输入   可用,read(2)返回0。

此模式可用于构建更高级别的通信功能,无论如何必须实现这些功能以处理部分读取(即,如果另一端在“数据包”中间崩溃),错误的数据包,拆分数据包等等上。这就是简单的read无法为你做的所有事情。

答案 1 :(得分:1)

看看select。它等待数据准备好读取(但实际上没有读取任何内容)。来自man page

  

超时 select()之前经过的时间量的上限   回报。它可能为零,导致 select()立即返回。 (这是   对于轮询非常有用。)如果 timeout 为NULL(无超时), select()可以阻止   下去。

代码看起来像:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 300000;

fd_set infds;
FD_ZERO(&infds);
FD_SET(fd, &infds);

// Assume fd is the file descriptor for the serial device
if (select(fd + 1, &infds, NULL, NULL, &tv) > 0)
{
    // The read will not block now
    // Assume buffer and size are declared and set appropriately
    amountRead = read(fd, buffer, size);
}