首页 > 解决方案 > 使用 Arduino 和 PySerial 回显一系列字节

问题描述

我正在编写一个程序,它使用 PySerial 向 Arduino Uno 发送一个 10 字节长的数据包(Arduino 和我的计算机的代码如下)。代码应该工作的方式是,每当一个字节包被发送到 Arduino 时,它就会将字节回显给计算机。然后主机(我的笔记本电脑)读取该数据,并将其打印到控制台(延迟 100 毫秒)。但是,当我运行代码时,它会慢慢打印出 10 个空字节,b''并且延迟超过 100 毫秒(更像是 750 毫秒)。此后,它按预期运行,按顺序打印出数据包的每个元素,中间有 100 毫秒的延迟。有没有人解释为什么会发生这种情况?

Python代码:

import serial
import time

ser = serial.Serial(port="COM3", baudrate=9600, timeout=1.0)

packet = [85, 85, 1, 10, 1, 32, 3, 184, 11, 13]

while True:
    p = bytes(packet)
    ser.write(p)

    for i in range(len(packet)):
        time.sleep(0.1)

        r = ser.read()
        print(r)

Arduino代码:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    int r = Serial.read();

    Serial.write(r);
  }
}

编辑:这是运行此程序时的控制台输出:

b''
b''
b''
b''
b''
b''
b''
b''
b''
b''
b'U'
b'U'
b'\x01'
b'\n'
b'\x01'
b' '
b'\x03'
b'\xb8'
b'\x0b'
b'\x0d'

[previous ten lines repeated indefinitely]

标签: arduinoserial-portpyserial

解决方案


开始出现延迟是因为如果串行端口像这样打开,Arduino 会自行重置(重新启动)。然后 Python 脚本中的读取操作会超时,直到 Arduino 重新启动并运行。解决方案是 使用..open()

这仅适用于与 Arduinos 的串行端口通信。当DTR 信号被拉高时它会重新启动的事实是一个(有问题的)功能:它允许 Arduino IDE 将新固件闪存到设备上并通过串行端口触发重新启动。


推荐阅读