奇怪的 (py) 系列 linux 腐败
Weird (py)serial linux corruption
我有一个基于 Atmel SAMA5D36 的 Linux SBC。我有另一个设备通过 /dev/ttyS2 通过 TTL 线 (115200 8N1) 连接到它。使用 pyserial,我与该设备进行了相当高的带宽 query/response 对话。
我会定期(至少每分钟一次)看到从另一台设备返回的日期出现非常可重复的损坏。如果它用
之类的文本进行响应
"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 通道。
我有一个基于 Atmel SAMA5D36 的 Linux SBC。我有另一个设备通过 /dev/ttyS2 通过 TTL 线 (115200 8N1) 连接到它。使用 pyserial,我与该设备进行了相当高的带宽 query/response 对话。
我会定期(至少每分钟一次)看到从另一台设备返回的日期出现非常可重复的损坏。如果它用
之类的文本进行响应"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 通道。