【问题标题】:Raspberry and Arduino connection: PySerial reading the same line over and overRaspberry 和 Arduino 连接:PySerial 一遍又一遍地读取同一行
【发布时间】:2017-10-23 15:03:45
【问题描述】:

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

上通过串行发送到 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'

目前没有找到类似的东西。任何想法,链接? (这里是第一次发帖,如果有什么需要补充的,请各位有经验的大侠给点建议)

【问题讨论】:

  • 为什么每次循环都连接到串口?
  • 嘿,好问题 :-) - 现在为什么这在所有可能的平台上都有效?我认为控制流和停止位很好,但不知何故错过了这一点。当我回到我的设置时,我会在 48 小时内尝试这个。感谢您指出这一点。

标签: python arduino raspberry-pi serial-port


【解决方案1】:

我正式是个白痴,正如上面提到的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! - 很明显!

【讨论】:

  • 请注意,其他 Arduino 板(带有 USB 串行转换器的板)往往会在串行连接时重置。因此,在其中一个上执行此操作可能会导致更多麻烦。
猜你喜欢
  • 2023-03-09
  • 2019-04-16
  • 1970-01-01
  • 2011-04-10
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多