用Arduino和PySerial回显一系列字节 [英] Echoing a Series of Bytes with Arduino and PySerial

查看:31
本文介绍了用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'
'
b'x01'
b' '
b'x03'
b'xb8'
b'x0b'
b'x0d'

[previous ten lines repeated indefinitely]

推荐答案

出现开始延迟是因为如果串行端口以这种方式打开,Arduino会自行重置(重新引导)。然后,Python脚本中的读取操作会超时,直到Arduino重新启动并运行。解决方案是在之前disable the DTR control signal in pySerial使用.open()显式打开端口。

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

这篇关于用Arduino和PySerial回显一系列字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆