减少树莓派到arduino串行通信的延迟

时间:2019-10-16 22:52:59

标签: python arduino serial-port

我当前正在尝试通过来自Raspberry Pi 3的串行通信旋转Arduino Uno上的电机。我的代码本身当前有效,但是有时在运行python脚本时,电机不会转动或没有任何响应。从网上可以找到的东西中,我感觉发送信号的速度要比Arduino读取信号的速度快,而且我似乎找不到找到使延迟最小并使电机响应一致的方法。

这是我的Arduino代码:

#include <Stepper.h>

#define STEPS 128 

Stepper stepper(STEPS, 8, 10, 9, 11);

void setup() {
  Serial.begin(9600);
}
void loop() {
if (Serial.read() == 50) {
stepper.setSpeed(8); //  rpm
stepper.step(128); // do n steps -- corresponds to one revolution in one minute
}
else if (Serial.read() == 51) {
stepper.setSpeed(8); //  rpm
stepper.step(-128); // do n steps -- corresponds to one revolution in one minute
}
}

这是我的Python代码

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)

time.sleep(1)
num="3"
ser.write(bytes(num.encode()))

我也不知道Arduino如何读取我的ser.write,因为当num = 2时,我在串行监视器中看到“ 50”,当num = 3时,我的串行监视器中出现了“ 51”,依此类推

谢谢!

2 个答案:

答案 0 :(得分:0)

串行通信始终以字节为单位。因此,通过接口发送的任何内容都将作为字节序列接收。当您将“ 3”编码为UTF-8时,它将作为0x33(51)发送。您的“ 2”分别为0x32(50)。

按照注释中的建议增加波特率将无济于事,因为这只会提高数据传输/接收的速度。如果不进行测量,则发送9600或115200波特的单个字节之间不会有任何区别。

只要两个设备都以相同的波特率运行并且您未超过任何设备的最大波特率(对于Arduino Uno约为200万波特),您就无法快速发送。 (请提供合适的电缆和距离)

您可能会遇到电缆过长的问题,但是即使在嘈杂的工业环境中,对于9600波特来说,距离也要数米。

通常,您在读取数据之前会等待数据在接收缓冲区中可用。

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
  }
}

可能不这样做会导致一些延迟。我不确定,因为您没有提供观察到的延迟时间。

如果在执行Python代码时Arduino已经在运行,则我的代码没有其他问题。如果在发送时正在引导,则可能会由于Arduino引导加载程序而出现一些延迟。在启动实际的应用程序代码之前,它将等待一段时间以进行可能的固件更新。

答案 1 :(得分:0)

在发送之前,可能有少量数据位于输出缓冲区中。写入后尝试使用Serial.flush(),让操作系统知道您希望尽快发送数据。