2016-03-03 194 views
0

通过pySerial正确接收数据有点问题:它通常不会读取完整的数据或太多的数据。有时并且有时候更常见的是,还有额外的字符或某些字符/部分的发送数据丢失。看来,PC和数据的发射器没有正确同步。PySerial没有正确接收数据

在我使用的Arduino当前示例中,发送的“Hello World”我的电脑的串口(操作系统是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 world代码)的循环中发送消息时,通常需要时间来稳定(虽然它再次只显示数据的中间片段),然后运行非常稳定,但即使如此它有时会打破单行。

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

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

回答

1

由于发生了一些不同的事情,您正在看什么。

首先,每次打开串口时,都会导致所谓的“自动复位”和Arduino重新启动。这可以通过硬件或者通过明确禁用RST信号打开来避免。如何做到这一点可能会有所不同,并超出了问题的范围。

然后我们必须明白,串口不会等待另一部分监听发送数据;所以如果你禁用自动复位并连接到Arduino,你应该看到程序输出的随机部分,取决于它的当前状态。

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

我们可以说,前3个工件可以通过缓冲数据+重新启动(当您发送大量数据时发生很多事情,并且打破代码的自动载入并且您必须执行手动过程),同时最后一个可能会阻止缓冲区填充,也许它被你禁用,也许一些奇怪的时间打开序列,也许你禁用了自动复位,也许是时间arduino列举消息的一部分消失了。

+0

感谢您的解释。总的来说,在通信开始之前是否有办法清除缓冲区(解决第3点)? – kire

+0

尝试使用 arduino.flushInput() 刚刚打开 – Lesto