Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux串行端口问题_Linux_Serial Port - Fatal编程技术网

Linux串行端口问题

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

我正在编写代码,以便在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)

查看
选择
。它等待数据准备好读取(但实际上不读取任何内容)。从:

超时是选择()之前经过的时间量的上限。 返回。它可能为零,导致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


这种模式可以用来构建更高级别的通信功能,这些功能必须实现,以便处理部分读取(即如果另一端在“分组”中间崩溃)、错误分组、分裂分组等等。这些都是简单的

读取
无法完成的。

您确定串行端口可以选择()吗?