当前位置: 首页 > 面试题库 >

Linux串行端口:阻止超时读取

蒙墨竹
2023-03-14
问题内容

我研究了许多有用的线程和一些教程,但是仍然存在一些问题,这些问题应该非常简单。作为参考,这里是我细读的一些线程:

无论如何,我有一个问题。如果我收到数据,我的代码可以正常工作。如果不这样做,则read()函数将停顿,退出程序的唯一方法是使用kill
-9(注意:我使用信号处理来发信号通知线程读取串行数据以终止。这不是罪魁祸首,即使我删除了信号处理,read()调用仍然停止。我正在尝试做的是一次读取,该读取一次阻塞并读取一个块(从而节省了CPU使用量),但是,如果读取未接收到任何数据,则我不想使其超时。

这是我要应用到端口的设置:

struct termios serial_struct;
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial_struct.c_iflag = IGNPAR;
serial_struct.c_oflag = 0;
serial_struct.c_lflag = 0;
serial_struct.c_cc[VTIME] = 1;  // timeout after .1s that isn't working
serial_struct.c_cc[VMIN] = 64;  // want to read a chunk of 64 bytes at a given time

然后,我使用tcsetattr()设置这些设置,并确认端口通过tcgetattr()接收了设置。我在想我的设置可能会发生冲突,因为我的读取似乎正在阻塞并且要等到接收到64个字节之后,才对超时不做任何事情。我知道我可以使用select()处理超时,但是我希望避免多次系统调用。

与往常一样,在此先感谢您的帮助。


问题答案:

来自man 3 termios:

MIN> 0; TIME>
0:TIME以十分之一秒为单位指定计时器的限制。一旦输入的初始字节可用,则在接收到每个其他字节后重启定时器。当读取了所请求的字节数或MIN字节中的较小者时,或者字节间超时到期时,read(2)返回。因为仅在初始字节可用后才启动计时器,所以将至少读取一个字节。

请注意,直到接收到至少一个字节的数据后,计时器才会 启动 。接收到第一个数据字节后,如果在接收到连续数据字节之间有十分之一秒的时间间隔,则读取将超时。



 类似资料:
  • 问题内容: 我以下列方式从打开的串行端口读取某些数据时遇到麻烦。我已经多次使用此代码实例,并且一切正常,但是现在,由于某种原因,我无法弄清楚,我完全无法从串行端口读取任何内容。 我能够写,并且在另一端正确接收了所有消息,但是从未收到答复(正确发送)(不,电缆都还好;)) 我用来打开串行端口的代码如下: 端口初始化后,我通过简单的write命令向其中写入一些内容。 hCom是文件描述符(没关系),并

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 我读了很多问题和答案,但没有找到任何解决方案。也许我的问题不对,但我需要一些指导。我在Linux中使用串行端口,从我的Arduino设备读取数据。每当我想从Arduino向Linux发送数据时,我首先发送两个字节,这表示将从Arduino发送的总字节数。我将这两个字节转换为整数值,并开始从串行端口读取数据。比如说,我想把300字节从Ardiuno发送到Linux,我只需要先写{1,44},然后用下

  • 我为Handler(Spring Webflow)写了一个测试 但结果我犯了一个错误。 处理程序很简单: 问题出在哪里?如果我直接向服务器发送请求,一切都可以。

  • 我做了一个python程序,从串行端口读取gps数据。GPS冰球流NMEA数据语句连续插入USB时。我的程序打开端口,然后尝试读取数据,解析它,然后将其与从Arduino提取的其他数据一起写入文本文件。 我遇到的问题是,当我第一次运行程序时,有时它无法读取数据。我放入了一些Try/Exception捕获,发现以某种方式无法从GPS串行端口读取数据 如果我点击Cntrl-C几次,这似乎可以解决它遇到

  • 问题内容: 用于规范模式状态的Termios手册页(http://man7.org/linux/man- pages/man3/termios.3.html ): 逐行提供输入。输入一个行定界符(NL,EOL,EOL2;或在行首的EOF)时,输入行可用。除EOF以外,行定界符包含在read(2)返回的缓冲区中。 我的问题是:当一块硬件输出符合规范的数据时,是否将0xD0xA(CRLF)字节放在传输