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

C Linux串行端口:阻止读取超时,c,linux,serial-port,C,Linux,Serial Port,我已经学习了许多有用的线程和一些教程,但我仍然有一些问题,应该是非常简单的。以下是我仔细阅读过的一些帖子供参考: 无论如何,我有点问题。如果我收到数据,我的代码工作正常。如果不这样做,read()函数将暂停,退出程序的唯一方法是使用kill-9(注意:我使用信号处理向读取串行数据的线程发出终止信号。这不是罪魁祸首,read()调用仍然会暂停,即使我已删除信号处理)。我试图做的是让读取一次阻塞并读取一个块(因此节省CPU使用),但是如果读取没有接收到数据,我不会让它超时 以下是我正在应用于端口

我已经学习了许多有用的线程和一些教程,但我仍然有一些问题,应该是非常简单的。以下是我仔细阅读过的一些帖子供参考:

无论如何,我有点问题。如果我收到数据,我的代码工作正常。如果不这样做,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()来处理超时,但我希望避免多次系统调用

一如既往,提前感谢您的帮助。

发件人:

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


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

Q:什么是设备(例如/dev/ttyS0)?这个端口上的设备是什么(RS232 COM端口?其他什么?)另外:如果您还不熟悉,这是一个非常好的链接:。您可能对“异步I/O”部分感兴趣。啊哈!所以termios无法在没有数据传递的情况下设置“真实”超时?那我怎么解决这个问题呢?关于select()?是:我上面引用的链接也讨论了“select()”。问:什么是设备?@我认为几乎每一个程序最终都会发展到这样的地步:(a)使用
select
poll
复用I/O,或(b)使用单独的线程处理单独的流。我只希望通过一个设备,一个可配置的串行端口来完成读取。一个线程处理从端口读取数据并将数据放在用户可以访问的位置。我希望避免多次系统调用,因为读取是在循环中进行的。但是,如果没有其他方法来确定我是否正在获取数据,那么看起来我必须…@it'sPete您可以通过将描述符设置为非阻塞模式,然后在
read
返回
EAGAIN
EWOULDBLOCK
时只调用
select
,来最小化系统调用的次数。