【发布时间】: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