减少 raspberry pi 到 arduino 串行通信的延迟
reducing delay on raspberry pi to arduino serial communication
我目前正在尝试通过我的 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”出现在我的串口中监控等。
谢谢!
串行通信始终以字节为单位进行。因此,无论您通过接口发送什么,都将作为字节序列接收。当您将“3”编码为 UTF-8 时,它将作为 0x33 (51) 发送。你的“2”分别是0x32(50)。
按照评论中的建议增加波特率对您没有帮助,因为它只会增加速度数据是 transmitted/received。如果不进行测量,您将不会注意到以 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 已经 运行ning,我没有发现您的代码有任何其他问题。如果它在您发送时正在启动,您可能会因为 Arduino 引导加载程序而观察到一些延迟。在启动实际应用程序代码之前,它会等待一段时间以进行可能的固件更新。
在发送之前,小块数据可能会留在输出缓冲区中。尝试在写入后使用 Serial.flush() 让 os 知道您希望尽快发送数据。
我目前正在尝试通过我的 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”出现在我的串口中监控等。
谢谢!
串行通信始终以字节为单位进行。因此,无论您通过接口发送什么,都将作为字节序列接收。当您将“3”编码为 UTF-8 时,它将作为 0x33 (51) 发送。你的“2”分别是0x32(50)。
按照评论中的建议增加波特率对您没有帮助,因为它只会增加速度数据是 transmitted/received。如果不进行测量,您将不会注意到以 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 已经 运行ning,我没有发现您的代码有任何其他问题。如果它在您发送时正在启动,您可能会因为 Arduino 引导加载程序而观察到一些延迟。在启动实际应用程序代码之前,它会等待一段时间以进行可能的固件更新。
在发送之前,小块数据可能会留在输出缓冲区中。尝试在写入后使用 Serial.flush() 让 os 知道您希望尽快发送数据。