gpt4 book ai didi

通过串口与 Arduino 接口(interface)的 Python 代码无法在 Raspberry Pi 上运行

转载 作者:行者123 更新时间:2023-12-01 04:02:59 25 4
gpt4 key购买 nike

我有一个 python 脚本,可以通过串口与 arduino 进行通信。它在我的计算机上按预期工作,但当我在 Raspberry Pi 上运行脚本时,它不起作用。打印“已发送:1”后卡住了。我认为它卡在等待来自 arduino 的一个字节(来自 sendValue 的第一行)。但是,我不知道为什么会发生这种情况,因为它在我的计算机或 Pi 的串行监视器上运行良好。

Python 脚本:

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

def sendValue(value):
ser.read(1) # Arduino will send one byte when it's ready for the value
ser.write(value) # Send value
print("Sent: {}".format(value))
return;

ser.write('1') # Select function '1'
print("Sent: 1")

sendValue('5000') # Send 1st parameter to function '1'
sendValue('4000') # Send 2nd parameter to function '1'

while True:
print(ser.readline())

Arduino 代码:

int task = 0;

int val = 0;
int val2 = 0;
int val3 = 0;

void task1(int length){
Serial.println(length);
digitalWrite(13, HIGH);
delay(length);
digitalWrite(13, LOW);
}

void task2(int length1, int length2){
Serial.print("Running task2 with parameters ");
Serial.print(length1);
Serial.print(" and ");
Serial.println(length2);
digitalWrite(13, HIGH);
delay(length1);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(length2);
digitalWrite(13, LOW);
}

void waitForSerial(){
while(Serial.available() == 0);
}

int getValue(){
Serial.write(48);
waitForSerial();
return Serial.parseInt();
}

int getCommand(){
if(Serial.available() == 0){
return -1;
}

String in = "";

in += (char)Serial.read();

return in.toInt();
}

void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}

void loop() {
task = getCommand();

switch(task){
case 0:
val = getValue();
task1(val);
val = 0;
break;
case 1:
val = getValue();
val2 = getValue();

task2(val, val2);
val = val2 = 0;
break;
}
}

我尝试在 ser.read(1) 中添加延迟,我认为它被卡住了,但仍然不起作用。

我无法决定是否将其放在 Raspberry Pi 社区或 Arduino 社区上,所以我将其放在这里。

最佳答案

您可能遇到与 Arduino 自动重置相关的问题。当 Arduino 重置时,需要几秒钟的时间来“重新启动”并开始运行其主程序 (loop())。当您连接到带有 Unix 操作系统的 Arduino(例如 Raspberry Pi)时,它会触发自动重置。如果您的 Python 脚本在连接后立即向 Arduino 发送数据,则该数据可能会被引导加载程序而不是 Arduino 处理器代码捕获,因为处理器尚未准备好,因此 Arduino 的行为就像什么都没有发生一样。如果您在 Windows 上测试 Arduino,您可能不会看到此行为;某些 Windows 配置不会在初始连接时触发自动重置,串行监视器也是如此。

我的解决方案只是在 python 脚本中创建串行连接之后、传输任何数据之前添加 5 秒的延迟。如果这解决了问题,那么您就可以更有创意的解决方案来告诉主机 Arduino 何时准备就绪。例如,您可以在 Arduino 草图的 setup() 部分末尾向主机打印一行 (Serial.println('READY');)。您还可以在 setup() 例程末尾添加几行代码,使板载 LED 闪烁,作为故障排除的视觉提示:

pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
delay(150);
digitalWrite(13, LOW);
delay(150);
digitalWrite(13, HIGH);
delay(150);
digitalWrite(13, LOW);

当您看到两次闪烁时,您知道处理器已准备好接收来自主机程序的通信。

关于通过串口与 Arduino 接口(interface)的 Python 代码无法在 Raspberry Pi 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com