Raspberry和Arduino连接:PySerial一遍又一遍地阅读同一行

时间:2017-10-23 15:03:45

标签: python arduino raspberry-pi serial-port

有一个串行阅读问题让我疯了。当前设置是连接到RaspberryPi(标准USB连接)的Arduino。尝试从 / dev / ttyACM0

中读取Arduino通过串口发送到Raspberry的串行信息

当尝试非常基本的监控时,原始读取:

$ (stty raw; cat) < /dev/ttyACM0
RFBee ready to receive!

: 03  Packet: 80  0F  EA  1D  D9  00  F3  15  FF  FF  RSSI: -60  LQI: 30  Error: 7  Next: 64  Packets: 4
RFBee ready to receive!


Index: 00  Packet: E0  0E  F2  C6  01  02  B1  91  FF  FF  RSSI: -60  LQI: 2F  Error: 7  Next: 64  Packets: 1
Index: 01  Packet: 50  0D  E7  FF  73  04  56  C4  FF  FF  RSSI: -60  LQI: 2F  Error: 7  Next: 64  Packets: 2
Index: 02  Packet: 80  0D  F6  1D  D8  0C  11  BE  FF  FF  RSSI: -61  LQI: 2F  Error: 7  Next: 64  Packets: 3
Index: 03  Packet: 20  0D  E7  D4  C1  86  AC  CA  FF  FF  RSSI: -61  LQI: 2E  Error: 7  Next: 64  Packets: 4
Index: 04  Packet: E0  0D  EF  C6  03  0C  FA  CE  FF  FF  RSSI: -61  LQI: 2F  Error: 7  Next: 64  Packets: 5
Index: 00  Packet: 50  0B  DF  FF  71  06  74  4B  FF  FF  RSSI: -60  LQI: 2E  Error: 0  Next: 64  Packets: 6
Index: 01  Packet: 80  0B  EA  1D  D8  06  29  E4  FF  FF  RSSI: -60  LQI: 2E  Error: 0  Next: 64  Packets: 7
Index: 02  Packet: 70  0A  F8  AC  03  8C  D4  16  FF  FF  RSSI: -61  LQI: 2E  Error: 0  Next: 64  Packets: 8

这一切似乎都或多或少都有效(除了准备接收线路的双RFBee),然后接着并逐行打印数据。 Minicom以同样的方式工作,读取数据,一切都很好。

使用PySerial,使用以下代码:

    #!/usr/bin/python -u
import serial

while True:
    with serial.Serial('/dev/ttyACM0', 115200) as ser:
            line = ser.readline()
            if line != '':
                print(line)

它只打印出这些行:

$ python davis_collect.py 
B  DF  CA  FF  FF  RSSI: -60  LQI: 2E  Error: 0  Next: 64  Packets: 9

RFBee ready to receive!

RFBee ready to receive!

RFBee ready to receive!

RFBee ready to receive!

RFBee ready to receive!

因此它首先捕获缓冲区的任何部分,但由于某种原因,它无法停止打印那条漂亮的线条。

添加一些基本信息:在我的笔记本上试过,PySerial工作了。串行通信也可以通过RasPi工作,因为它可以通过标准实用程序读取。

Python3输出:

python3 davis_collect.py 
b'RFBee ready to receive!\r\n'
b'RFBee ready to receive!\r\n'
b'RFBee ready to receive!\r\n'
b'RFBee ready to receive!\r\n'
b'RFBee ready to receive!\r\n'
到目前为止,没有找到类似的东西。任何想法,链接? (首先发布在这里,如果我需要添加一些东西,请你,更有经验的人,留下建议)

1 个答案:

答案 0 :(得分:0)

我是正式的白痴,正如上面提到的gre_gor(感谢头部的踢),循环被调用并且每次都连接到串口。

这对您通常遇到的大多数机器都不会造成问题,但由于RasPi上的默认设置 - 缓冲区处理 - 每次连接后都会在循环中读取第一行。

足以说明,使用(注意我连接后的无限循环):

#!/usr/bin/python -u
import serial

with serial.Serial('/dev/ttyACM0', 115200) as ser:
      while True:
            line = ser.readline()
            if line != '':
                print(line)
相反,产生了预期的结果。我补充说:Doh! - 显然!