我有一个基于 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 channel 。
关于python - 奇怪的 (py) 串行 linux 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898804/