我正在编写代码,以便通过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)
答案 0 :(得分:2)
如果您希望read
在超时后没有数据返回,您可以设置MIN == 0
和TIME > 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);
}