我有一个基于Atmel SAMA5D36的Linux SBC。我有另一个设备通过TTL线(115200 8N1)通过/dev/ttyS2连接到它。使用pyserial,我与该设备进行了相当高的带宽查询/响应对话。
定期(至少每分钟一次),我看到另一台设备返回的日期非常可重复。如果是用诸如
"123456" (ascii character values)
它将删除一个字符,并在以下字符之后添加字符-0:
"13\x00456"
希望这很清楚。它将删除2,下一个字符如预期,跟随一个字符0,然后恢复正常。
我正在使用内核4.1.10。通过一些调试语句,我很确定这不会在我的python循环中发生,因为0出现在read()缓冲区的随机位置。我还在输入行上连接了一个示波器,并验证了该导线没有发生这种损坏。
我正在寻找一个答案,可以使我朝正确的方向弄清楚为什么会这样。 CPU负载似乎确实增加了频率(例如,当我为连接的BLE适配器执行大量DBUS通信时)。
最佳答案
这可能是溢出错误的结果。如果查看atmel_serial,则可以查看是否有任何错误。
cat /proc/tty/driver/atmel_serial
例如,在ttyS2上,您可能会看到以下信息(oe:显示溢出错误):
2: uart:ATMEL_SERIAL mmio:0xF0020000 irq:31 tx:266758 rx:361385 oe:51 RTS|DTR|DSR|CD|RI
由于您是高速率串行设备,因此您可以尝试在USART线路上实现DMA。通过在usart设置中添加以下内容,在内核中调整适当的dts文件:
atmel,use-dma-rx;
atmel,use-dma-tx;
对于我的内核,我必须禁用SPI和I2C,以便为USART提供足够的DMA通道。