PySerial无法正确接收数据

时间:2016-03-03 15:10:47

标签: python arduino serial-port pyserial

我通过pySerial正确接收数据有点问题:它通常不会读取完整数据或太多数据。有时,有时甚至更频繁地,还有其他字符或某些字符/部分的发送数据丢失。看来,PC和数据发射器没有正确同步。

在当前示例中,我使用了arduino,发送了“Hello World'到我的PC的串口(os是Ubuntu 14.04),带有以下简单代码:

void setup(){
  Serial.begin(9600);
  Serial.print("Programme initiated\n");
}

我使用以下python3代码来接收数据:

import serial
import time

arduino = serial.Serial(port, baudrate=9600, timeout=2)
print(arduino.isOpen)
print(arduino)
time.sleep(1)    

while True:
    print(arduino.readline())

这是一个非常简单的教程示例,这是我收到的内容(除了正确的内容):

b'PrProgramme initiated\n'

b'PProgramme initiated\n'

b'ProgProgramme initiated\n'

b'ogramme initiated\n'

我在代码中遇到了更复杂的问题,但我仍然没有解决这个问题。当从arduino(标准hello世界代码)循环发送消息时,它通常需要时间来稳定(同时,它再次只显示数据的中间片段)并且在此之后运行相当稳定,但即便如此它有时会打破单行。

与万用表设备通信时遇到了同样的困难。在那里,它通常不会读取第一个字符或与之前的数据混合。

以前有人遇到过这个问题吗?我认为这是一个同步的问题,但我不知道如何解决它。让我感到困惑的是,我真的只使用了教程,但它似乎并没有正常工作。或者这是我PC的配置问题?

1 个答案:

答案 0 :(得分:1)

你正在看的事情正在发生,因为正在发生一些不同的事情。

首先,每次打开串口时,都会导致所谓的“autoreset”和Arduino重启。通过在打开时明确禁用RST信号,可以在硬件甚至软件中避免这种情况。如何做到这一点可能会有所不同,超出了问题的范围。

然后我们必须明白串口不会等待其他部分监听发送数据;因此,如果您禁用自动复制并连接到Arduino,您应该看到程序输出的随机部分,具体取决于其当前状态。

最后我们在pc上有一些缓冲功能(有时甚至在UART到USB端),所以如果你没有收听数据丢失,它可能仍然在缓冲区中。

我们可以说缓冲数据+重启可以给出前3个工件(当你发送大量数据时会发生这种情况,并且会破坏代码的自动加载,你必须做一个手动程序),而最后一个可能是阻止缓冲区填充的东西,也许它被你禁用了,也许是一些奇怪的时间打开串口,也许你禁用了自动复位,也许是arduino枚举部分消息的时间已经消失。