【发布时间】:2015-03-04 21:43:04
【问题描述】:
我正在从连接到传统 linux 内核 (Ubuntu 12.04) 上的标准 RS-232 串行端口的传感器读取数据
传感器输出频率为 1000Hz。并以 115200、8N1 的波特率连接。每个传感器读数为 4 字节,总吞吐量为 4Kb/s。示波器确认的传输模式是一个 4 字节的突发,然后是近毫秒的暂停。传感器非常非常一致。
99% 的数据包以非常低的延迟接收。然而,对于大约 0.5% 的字节,串行端口读取阻塞 2-8ms。在这个块之后,所有“丢失”的字节都被非常快速地读取。这表明数据在极少数情况下被缓冲。
我已经尝试了调度程序优先级(很好)和串行端口设置(ASYNC_LOW_LATENCY、VMIN、VTIME、原始、非阻塞设置等)。这些似乎都没有任何明显的效果。
除了重新编译内核或切换到更实时的操作系统之外,我还能做些什么来获得更一致的串行端口读取?
【问题讨论】:
-
“这表明数据在极少数情况下被缓冲” -- 每个字节总是被缓冲(通常两次)。 read() 系统调用从缓冲区中获取字节,而不是直接从 UART 的寄存器或 FIFO 中获取。
-
正确。我的意思是字节排队的速度比读取的速度快。我的断言是 1ms 应该足以让 read() 从缓冲区中拉出一个字节,而我看到有时缓冲区增长需要 2-8ms。
-
其中一些是 Atmel ARM 特有的,但 at91.com/viewtopic.php?t=21497 可能有一些有用的东西
标签: serial-port latency