gpt4 book ai didi

c - Linux 串口 : Blocking Read with Timeout

转载 作者:IT王子 更新时间:2023-10-29 01:16:28 26 4
gpt4 key购买 nike

我已经研究了许多有用的线程和一些教程,但我仍然对一些应该非常简单的东西有一些问题。作为引用,这里有一些我仔细阅读过的话题:

How to implement a timeout in read function call?

how to open, read, and write from serial port in C

无论如何,我有点问题。如果我收到数据,我的代码可以正常工作。如果我不这样做,read() 函数就会停止,退出我的程序的唯一方法是使用 kill -9(注意:我使用信号处理来向读取串行数据的线程发出终止信号。这不是罪魁祸首,即使我删除了信号处理,read() 调用仍然会停止)。我想要做的是让读取一次阻塞并读取一个 block (因此节省 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 specifies the limit for a timer in tenths of a second. Once an initial byte of input becomes available, the timer is restarted after each further byte is received. read(2) returns either when the lesser of the number of bytes requested or MIN byte have been read, or when the inter-byte timeout expires. Because the timer is only started after the initial byte becomes available, at least one byte will be read.

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

关于c - Linux 串口 : Blocking Read with Timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18070731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com