使用 Arduino 和 PySerial 回显一系列字节
Posted
技术标签:
【中文标题】使用 Arduino 和 PySerial 回显一系列字节【英文标题】:Echoing a Series of Bytes with Arduino and PySerial 【发布时间】:2018-07-18 00:27:42 【问题描述】:我正在编写一个程序,它使用 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]
【问题讨论】:
【参考方案1】:开始出现延迟是因为如果串行端口像这样打开,Arduino 会自行重置(重新启动)。然后 Python 脚本中的读取操作会超时,直到 Arduino 重新启动并运行。解决办法是disable the DTR control signal in pySerial之前用.open()
显式打开端口。
这仅适用于与 Arduinos 的串行端口通信。当DTR signal 拉高时它会重新启动这一事实是一个(有问题的)功能:它允许 Arduino IDE 将新固件刷入设备并通过串行端口触发重新启动。
【讨论】:
以上是关于使用 Arduino 和 PySerial 回显一系列字节的主要内容,如果未能解决你的问题,请参考以下文章
在使用 pyserial 和 Arduino 时面临 TkInter 的问题
PySerial + Arduino MEGA 1 秒延迟/响应时间
无法使用pyserial在arduino和python之间进行通信