如何检测缓冲区溢出在Linux上使用c + +的串行端口上运行

我有一个很大的问题。 目前我正在通过以下钩子访问串行端口:

fd = open( "/dev/ttyS1", O_RDWR | O_NOCTTY ) 

然后我使用下面的代码块读取它

 i = select( fd + 1, &rfds, NULL, NULL, &tv ) ... iLen = read( fd, buf, MAX_PACKET_LEN ) 

问题是,在我读之前,我需要检测是否有任何缓冲区溢出。 在串口级别和内部tty翻转缓冲区。

我们尝试了cat /proc/tty/driver/serial但似乎并没有列出溢出(见下面的输出)

 1: uart:16550A port:000002F8 irq:3 tx:70774 rx:862484 fe:44443 pe:270023 brk:30301 RTS|CTS|DTR 

Solutions Collecting From Web of "如何检测缓冲区溢出在Linux上使用c + +的串行端口上运行"

根据内核的来源,你应该使用TIOCGICOUNT ioctl。 第三个ioctl参数应该是一个指向下面的结构体的指针,在<linux/serial.h>定义:

 /* * Serial input interrupt line counters -- external structure * Four lines can interrupt: CTS, DSR, RI, DCD */ struct serial_icounter_struct { int cts, dsr, rng, dcd; int rx, tx; int frame, overrun, parity, brk; int buf_overrun; int reserved[9]; }; 

我不知道是否每个驾驶员都检测到所有情况。

黑暗的Templer,

你的串行驱动程序应该更新icount.frame / overrun错误。

serial_core.h中的struct uart_port具有成员结构体uart_icount,应该根据接收到的中断在平台串行设备驱动程序中进行更新。