PySerial 没有正确接收数据

PySerial does not receive data correctly

我在通过 pySerial 正确接收数据时遇到一点问题:它通常不会读取完整数据或读取过多数据。有时,有时更常见的是,发送的数据中有额外的字符或某些 characters/parts 丢失。看来,PC和数据的发射器没有正确同步。

在当前示例中我使用了arduino,将'Hello World'发送到我PC的串行端口(os是Ubuntu14.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 world 代码)循环发送消息时,它通常需要时间来稳定(同时,它再次只显示数据的中间片段)然后 运行 非常稳定, 但即便如此,它有时也会分解单行。

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

以前有人遇到过这个问题吗?我认为这是一个同步问题,但我不知道如何解决。令我困惑的是,我真的只使用了教程的东西,而且它似乎不能正常工作。还是我电脑的配置问题?

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

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

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

最后我们在 pc 上有一些缓冲能力(有时甚至在 UART 到 USB 端),所以如果你不听数据丢失,它可能仍在缓冲区中是不正确的。

我们可以说前 3 个工件可能是通过缓冲数据 + 重启(当您发送大量数据时经常发生这种情况,并且会破坏代码的自动上传,您必须执行手动过程),虽然最后一个可能是阻止缓冲区填充的东西,也许它被你禁用了,也许一些奇怪的时间打开了串行,也许你禁用了自动重置,也许 arduino 被枚举的部分消息的时间已经消失了。