Linux 如何将字节间延迟超时设置为毫秒?

Linux 如何将字节间延迟超时设置为毫秒?,linux,serial-port,termios,Linux,Serial Port,Termios,我目前正在使用termios在Linux中进行串行通信 我需要将字符间超时设置为5ms 我找到了一种使用VMIN和VTIME设置字符间超时的方法,其中VMIN必须是VMIN>0和VTIME>0 问题是我需要将VTIME设置为5ms,但VTIME是以十分之一秒表示的 VTIME数据类型是unsigned char,所以我不能将其设置为0.05 有人知道有什么办法吗 我需要将字符间超时设置为5ms。 … 有人知道有什么办法吗 不,无法将termios超时设置为短于100毫秒。 根据您的硬件和内核配置

我目前正在使用termios在Linux中进行串行通信

我需要将字符间超时设置为5ms

我找到了一种使用VMIN和VTIME设置字符间超时的方法,其中VMIN必须是VMIN>0和VTIME>0

问题是我需要将VTIME设置为5ms,但VTIME是以十分之一秒表示的

VTIME数据类型是unsigned char,所以我不能将其设置为0.05

有人知道有什么办法吗

我需要将字符间超时设置为5ms。

有人知道有什么办法吗

不,无法将termios超时设置为短于100毫秒。
根据您的硬件和内核配置,此超时可能根本不可靠,尤其是在您试图检测分时消息时。
termios处理至少在UART设备驱动程序上方一整层(请参阅 ).
除非将内核配置为确保UART驱动程序的下半部分和termios的kworker线程具有高优先级和低延迟,否则无法准确或可靠地确定较短的字符间隔

如果UART使用FIFO缓冲传入数据,则该硬件会掩盖软件可以检测到的字符间距。
类似地,当UART驱动程序使用DMA存储接收到的数据时,字符间的定时也会变得模糊。
在DMA操作完成之前,CPU不参与处理接收到的数据,并且所有关于字符间分离的时间信息都消失了。
(使用DMA时,帧错误和/或奇偶校验错误等关键信息很难/不可能精确定位到特定字节。)
即使没有DMA,termios也只能使用基于通过tty翻转缓冲区(这是一个从线路上的定时中移除的层)传输数据的定时

一些UART确实有硬件来帮助检测空闲线路的消息结束。
例如,Atmel/Microchip ATSAMA5和AT91SAM9 SOC具有接收机超时功能,可测量每个接收帧后的空闲时间。
当空闲线路时间超过指定值时,可以生成中断。
Atmel USART的Linux驱动程序通常使用接收器超时中断(提前)终止当前DMA接收操作,并将DMA缓冲区的内容复制到tty翻转缓冲区

总之,您不能也不应该仅依靠VMIN和VTIME设置来检测分时消息。请参阅。
消息包需要具有分隔符/哨兵字符/字节,以便可靠地分析和验证消息。
有关有效使用带有本地缓冲区的系统调用的示例,请参阅

我需要将字符间超时设置为5ms。

有人知道有什么办法吗

不,无法将termios超时设置为短于100毫秒。
根据您的硬件和内核配置,此超时可能根本不可靠,尤其是在您试图检测分时消息时。
termios处理至少在UART设备驱动程序上方一整层(请参阅 ).
除非将内核配置为确保UART驱动程序的下半部分和termios的kworker线程具有高优先级和低延迟,否则无法准确或可靠地确定较短的字符间隔

如果UART使用FIFO缓冲传入数据,则该硬件会掩盖软件可以检测到的字符间距。
类似地,当UART驱动程序使用DMA存储接收到的数据时,字符间的定时也会变得模糊。
在DMA操作完成之前,CPU不参与处理接收到的数据,并且所有关于字符间分离的时间信息都消失了。
(使用DMA时,帧错误和/或奇偶校验错误等关键信息很难/不可能精确定位到特定字节。)
即使没有DMA,termios也只能使用基于通过tty翻转缓冲区(这是一个从线路上的定时中移除的层)传输数据的定时

一些UART确实有硬件来帮助检测空闲线路的消息结束。
例如,Atmel/Microchip ATSAMA5和AT91SAM9 SOC具有接收机超时功能,可测量每个接收帧后的空闲时间。
当空闲线路时间超过指定值时,可以生成中断。
Atmel USART的Linux驱动程序通常使用接收器超时中断(提前)终止当前DMA接收操作,并将DMA缓冲区的内容复制到tty翻转缓冲区

总之,您不能也不应该仅依靠VMIN和VTIME设置来检测分时消息。请参阅。
消息包需要具有分隔符/哨兵字符/字节,以便可靠地分析和验证消息。
有关有效使用带有本地缓冲区的系统调用的示例,请参阅