Linux串行端口问题
我正在编写代码,以便在linux中通过串行通信与另一台设备通信 我希望即使到达0个字符,也不阻塞超时。termios结构允许您设置VTIME和VMIN,但如果VMIN大于0,并且返回0个字符,则读取调用将永久阻止…WTF,为什么。这似乎不包括其他设备在短时间内停机,而现在我的应用程序在读取调用时被阻止的情况。这似乎是一个值得忽视的关键行为。我真的不想实施我自己的超时Linux串行端口问题,linux,serial-port,Linux,Serial Port,我正在编写代码,以便在linux中通过串行通信与另一台设备通信 我希望即使到达0个字符,也不阻塞超时。termios结构允许您设置VTIME和VMIN,但如果VMIN大于0,并且返回0个字符,则读取调用将永久阻止…WTF,为什么。这似乎不包括其他设备在短时间内停机,而现在我的应用程序在读取调用时被阻止的情况。这似乎是一个值得忽视的关键行为。我真的不想实施我自己的超时 Write command Read block timeout of around .3s(if 0 characters, s
Write command
Read block timeout of around .3s(if 0 characters, still wait max of .3s)
查看
选择。它等待数据准备好读取(但实际上不读取任何内容)。从:
超时是选择()之前经过的时间量的上限。
返回。它可能为零,导致select()立即返回。(这是
如果超时为空(无超时),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);
}
如果希望read
在超时后返回而没有数据,可以设置MIN==0
和TIME>0
。从tcsetattr(3)
:
MIN==0;时间>0:TIME指定计时器的限制(以十分之一为单位)
一秒钟。定时器在调用read(2)时启动。读(2)
当至少有一个字节的数据可用或
计时器过期了。如果计时器过期而没有任何输入变为
可用,读取(2)返回0
这种模式可以用来构建更高级别的通信功能,这些功能必须实现,以便处理部分读取(即如果另一端在“分组”中间崩溃)、错误分组、分裂分组等等。这些都是简单的
读取无法完成的。您确定串行端口可以选择()吗?