如何将字节间延迟超时设置为毫秒?
How to set Inter-Byte Delay Timeout to milliseconds?
我目前正在 Linux 中使用 termios 进行串行通信。
我需要将字符间超时设置为 5 毫秒。
我找到了一种使用 VMIN 和 VTIME 设置字符间超时的方法,其中 VMIN 必须是 VMIN > 0 且 VTIME > 0。
问题是我需要将 VTIME 设置为 5ms,但 VTIME 以十分之一秒表示。
VTIME 数据类型是 unsigned char,所以我不能只将它设置为 0.05。
有谁知道是否有办法解决这个问题?
I need to set an intercharacter timeout to 5ms.
...
Does anyone know if there is some way around this?
不,无法设置比 100 毫秒更短的 termios 超时。
根据您的硬件和内核配置,此超时可能根本不可靠,尤其是当您尝试检测时间分隔的消息时。
termios 处理至少在 UART 设备驱动程序之上的一个完整层(请参阅
Linux serial drivers).
除非您的内核配置为确保 UART 驱动程序的下半部分和 termios 的 kworker 线程具有高优先级和低延迟,否则无法准确或可靠地确定短的字符间间隔。
如果 UART 使用 FIFO 来缓冲传入数据,则该硬件会掩盖软件可以检测到的字符间距。
同样,当 UART 驱动程序使用 DMA 存储接收到的数据时,字符间时序将被模糊。
对于 DMA,在 DMA 操作完成之前,CPU 不涉及处理接收到的数据,并且有关任何字符间分隔的所有时间信息都消失了。
(帧错误 and/or 奇偶校验错误等重要信息是 difficult/impossible 以在使用 DMA 时查明特定字节。)
即使没有 DMA,termios 也只能使用基于通过 tty 翻转缓冲区传输数据的时序(这是从线路时序中删除的一层)。
某些 UART 确实具有硬件,可通过空闲线路协助检测消息结束。
例如 Atmel/Microchip ATSAMA5 和 AT91SAM9 SoC 的 USART 具有接收器超时功能,可测量每个接收帧后的空闲时间。
当这个空闲线路时间超过指定值时,可以产生中断。
Linux Atmel USART 驱动程序通常使用接收器超时中断(过早地)终止当前 DMA 接收操作,并将 DMA 缓冲区的内容复制到 tty 翻转缓冲区。
总而言之,您不能或不应仅依赖 VMIN 和 VTIME 设置来检测时间分隔的消息。参见 Parsing time-delimited UART data。
消息数据包需要有 delimiter/sentinel characters/bytes 以便消息能够被可靠地解析和验证。
有关使用本地缓冲区有效使用系统调用的示例,请参阅 。
我目前正在 Linux 中使用 termios 进行串行通信。
我需要将字符间超时设置为 5 毫秒。
我找到了一种使用 VMIN 和 VTIME 设置字符间超时的方法,其中 VMIN 必须是 VMIN > 0 且 VTIME > 0。
问题是我需要将 VTIME 设置为 5ms,但 VTIME 以十分之一秒表示。
VTIME 数据类型是 unsigned char,所以我不能只将它设置为 0.05。
有谁知道是否有办法解决这个问题?
I need to set an intercharacter timeout to 5ms.
...
Does anyone know if there is some way around this?
不,无法设置比 100 毫秒更短的 termios 超时。
根据您的硬件和内核配置,此超时可能根本不可靠,尤其是当您尝试检测时间分隔的消息时。
termios 处理至少在 UART 设备驱动程序之上的一个完整层(请参阅
Linux serial drivers).
除非您的内核配置为确保 UART 驱动程序的下半部分和 termios 的 kworker 线程具有高优先级和低延迟,否则无法准确或可靠地确定短的字符间间隔。
如果 UART 使用 FIFO 来缓冲传入数据,则该硬件会掩盖软件可以检测到的字符间距。
同样,当 UART 驱动程序使用 DMA 存储接收到的数据时,字符间时序将被模糊。
对于 DMA,在 DMA 操作完成之前,CPU 不涉及处理接收到的数据,并且有关任何字符间分隔的所有时间信息都消失了。
(帧错误 and/or 奇偶校验错误等重要信息是 difficult/impossible 以在使用 DMA 时查明特定字节。)
即使没有 DMA,termios 也只能使用基于通过 tty 翻转缓冲区传输数据的时序(这是从线路时序中删除的一层)。
某些 UART 确实具有硬件,可通过空闲线路协助检测消息结束。
例如 Atmel/Microchip ATSAMA5 和 AT91SAM9 SoC 的 USART 具有接收器超时功能,可测量每个接收帧后的空闲时间。
当这个空闲线路时间超过指定值时,可以产生中断。
Linux Atmel USART 驱动程序通常使用接收器超时中断(过早地)终止当前 DMA 接收操作,并将 DMA 缓冲区的内容复制到 tty 翻转缓冲区。
总而言之,您不能或不应仅依赖 VMIN 和 VTIME 设置来检测时间分隔的消息。参见 Parsing time-delimited UART data。
消息数据包需要有 delimiter/sentinel characters/bytes 以便消息能够被可靠地解析和验证。
有关使用本地缓冲区有效使用系统调用的示例,请参阅