繁体   English   中英

Linux串口问题

[英]Linux serial port woes

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

如果你想read一个超时后没有数据返回,您可以设置MIN == 0TIME > 0 来自tcsetattr(3)

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

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

看一下select 它等待直到数据准备好读取(但实际上不读取任何内容)。 手册页

超时select()返回之前经过的时间的上限。 它可能为零,导致select()立即返回。 (这对轮询很有用。)如果超时为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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM