【问题标题】:Python: '\x00' randomly appearing in serial from arduino to raspberry piPython:'\x00' 随机出现在从 arduino 到树莓派的序列中
【发布时间】:2017-04-15 09:09:13
【问题描述】:

我正在通过 /dev/ttyUSB0 端口将数据从 arduino 流式传输回树莓派。我在 pi 端使用 python 来读取传入的串行数据。出于调试目的,我目前正在打印出每个 serial.readLine()。下面可以看到两行调试:

['A', '337', '731', '88\r\n']

['A', '33\x009', '1931', '8\r\n']

每隔一段时间,数据中就会出现一个随机的 \x00,我不知道它是从哪里来的。我没有简化来自 arduino 的串行通信,所以我相信它会将每个数字作为单独的字节发送,例如 3 3 \x00 9 ,因此显然可以改进。

这似乎只发生在我在 python 中的单独线程中运行串行通信时...

一些相关代码 阿杜诺:

Serial2.print(F("A,"));
Serial2.print(startingAngle + ix);
Serial2.print(F(","));
Serial2.print(int(aryDist[ix]));
Serial2.print(F(","));
Serial2.println(aryQuality[ix]);

Python:

queue = Queue()
lidar_thread = Thread( target=lidar.process, args=(queue, ))
lidar_thread.start()

在线程函数中:

with serial.Serial('/dev/ttyUSB0', 115200, timeout=1) as ser:
   ser.write(b'ShowDist\n')
   while True:
      s = ser.readline()
      vals = s.split(',')

同样,如果我只是在线程之外调用该函数,它似乎可以正常工作。关于这个 '\x00' 来自哪里以及为什么它似乎只在多线程时发生的任何想法?最后,我想将每个值转换为一个 int ,当包含额外的字节时它会中断......我也会对一种计算成本低的方法感兴趣,在解析之前检查字节是否正常......从我读过的try catch 方法可以减慢速度。

谢谢

【问题讨论】:

  • 您是否有可能在使用 readline 时遇到超时,理解的超时会给您一个 EOF pyserial.readthedocs.io/en/latest/shortintro.html 同时它没有意义,因为 EOF val 为 -1? \0 通常用作字符串中的终止符,它可能来自 Arduino 吗?
  • “关于这个 '\x00' 来自哪里的任何想法。” -- 来自 termios 的 Linux 手册页:“如果 IGNPAR 和 PARMRK 均未设置,则读取一个字符奇偶校验错误或帧错误为 \0。"

标签: python multithreading arduino serial-port raspberry-pi


【解决方案1】:

我在 ubuntu 中使用 Python 2.7 中的 pyserial 遇到了相同的行为。我正在使用设备实现串行通信 rs-232 的驱动程序。由于我的软件假设对设备进行独占处理,因此我对其进行了深入研究,发现 Linux 不支持对串行端口的独占访问(或者至少不支持直接访问)。因此,为了查看我的驱动程序可能出现的问题(由于非排他性的原因),我在驱动程序运行时通过 python 控制台打开了相同的端口。这给出了您所描述的完全相同的问题,有趣的是即使我关闭控制台中的端口,问题仍然存在。除非您完全关闭用于打开串行端口的线程(在我的情况下退出 ipython),否则问题不会停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2013-02-08
    相关资源
    最近更新 更多