使用 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 秒延迟/响应时间

arduino 使用 pySerial 打开/关闭 LED

无法使用pyserial在arduino和python之间进行通信

重新打开后,arduino 和 pyserial 之间的串行连接变慢

通过 pySerial 通过 Python 控制 Arduino