【问题标题】:periodic serial port latency周期性串口延迟
【发布时间】: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


【解决方案1】:

【讨论】:

  • 谢谢,但根据我的帖子,我已经尝试过 ASYNC_LOW_LATENCY,无论是通过 setserial 还是通过代码,都没有效果。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多