python - 奇怪的 (py) 串行 linux 损坏

标签 python linux serial-port pyserial

我有一个基于 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/

相关文章:

linux - 错误-3 打开ST-Link/V2设备

python - 从 Ignition 中的串行读取十六进制或十进制

python - 如何解释 MIDI 文件分析的参数值,尤其是 "data"的 "midi.NoteOnEvent"字段?

python - 使用 cv.fromarray 将转置的 NumPy 数组转换为 Python 中的 CvMat 类型

python - os.walk 无法正确处理路径中的 unicode 字符

linux - ctypes.util.find_library 是否符合 Linux 中的 "usual"库链接实践?

python - 自动重新加载 PythonAnywhere.com 上托管的 Python-Flask 应用程序

linux - Qt 低功耗蓝牙多连接

serial-port - 无法使用 Node-RED v0.17.3 读取 Raspberry Pi 3 上的 XBee Api 框架

java - Java中的串行通信