我有一个基于Atmel SAMA5D36的Linux SBC。我有另一个设备通过/ dev / ttyS2通过TTL线(115200 8N1)连接到它。使用pyserial,我与该设备进行了相当高带宽的查询/响应对话。
定期(至少每分钟一次),我看到从另一台设备返回的日期的可重复损坏。如果是回复一些文字,如
"123456" (ascii character values)
它将删除一个字符并在以下字符后添加字符0:
"13\x00456"
希望这很清楚。它将丢弃2,下一个字符是预期的,一个字符-0跟随,然后恢复正常。
我正在使用内核4.1.10。通过一些调试语句,我很确定这在我的python循环中没有发生,因为0显示在read()缓冲区的随机位置。我还在传入的线路上连接了一个范围,并且已经验证了线路没有带来这种损坏。
我正在寻找一个可以让我找到正确方向的答案,找出发生这种情况的原因。 CPU负载似乎似乎来增加频率(例如,当我为附加的BLE适配器做一堆DBUS流量时)。
答案 0 :(得分:3)
这可能是溢出错误的结果。如果你查看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通道。