我学习了许多有用的线程和教程,但是我仍然遇到了一些问题,这应该是非常简单的事情。以下是我查阅过的一些线程供参考:
如何在read函数调用中实现超时?
如何在C中打开、读取和写入串口?
无论如何,我有一个小问题。如果我接收到数据,我的代码就可以正常工作。如果没有,read()函数就会停止运行,而且唯一的退出程序的方法是使用kill -9命令。(注意:我使用信号处理来通知正在读取串口数据的线程终止。这不是罪魁祸首,即使我已经删除了信号处理,read()调用仍会停止运行)。我想做的是有一个阻塞读取并每次读取一个块(因此节省CPU使用),但是如果读取没有接收到数据,我希望它超时。
以下是我应用于端口的设置:
我使用 tcsetattr() 设置这些设置,通过 tcgetattr() 确认端口已接收到这些设置。我认为我的设置可能会发生冲突,因为我的读取似乎是阻塞的,并且等待接收到 64 个字节,但不会对超时做任何处理。我知道可以使用 select() 处理超时,但希望避免多次系统调用。
像往常一样,提前感谢您的帮助。
以下是我应用于端口的设置:
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() 处理超时,但希望避免多次系统调用。
像往常一样,提前感谢您的帮助。