我通过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的配置问题?
答案 0 :(得分:1)
你正在看的事情正在发生,因为正在发生一些不同的事情。
首先,每次打开串口时,都会导致所谓的“autoreset”和Arduino重启。通过在打开时明确禁用RST信号,可以在硬件甚至软件中避免这种情况。如何做到这一点可能会有所不同,超出了问题的范围。
然后我们必须明白串口不会等待其他部分监听发送数据;因此,如果您禁用自动复制并连接到Arduino,您应该看到程序输出的随机部分,具体取决于其当前状态。
最后我们在pc上有一些缓冲功能(有时甚至在UART到USB端),所以如果你没有收听数据丢失,它可能仍然在缓冲区中。
我们可以说缓冲数据+重启可以给出前3个工件(当你发送大量数据时会发生这种情况,并且会破坏代码的自动加载,你必须做一个手动程序),而最后一个可能是阻止缓冲区填充的东西,也许它被你禁用了,也许是一些奇怪的时间打开串口,也许你禁用了自动复位,也许是arduino枚举部分消息的时间已经消失。