Python和Arduino串口通信:发送和接收
Python and Arduino Serial Communication: send and receive
其实我想做的是查询Arduino获取数据。当我从 Python 向 Arduino 发送命令时,Arduino 将根据查询关键字发回一些数据。我能够做到这一点,但速度非常低,我希望有一种更有效的方法来做到这一点,例如,每秒至少查询 100 次。任何的想法?谢谢!
我使用的代码:
Arduino:
int temp=1;
char s[2];
int speedIn=0;
void setup() {
Serial.begin(115200);
}
void loop() {
if(Serial.available()>0){
Serial.readBytes(s,1);
speedIn=int(s[0]);
if(speedIn==49){
Serial.println(">Data1Send<");
speedIn=0;
}
else if(speedIn==50){
Serial.print(">");
Serial.print(temp);
Serial.println("<");
speedIn=0;
}
else{
Serial.println(">Wrong Data<");
speedIn=0;
}
}
if(temp<300){
temp=temp+1;
}
//delay(100);
}
Python:
import serial
import time
if __name__=="__main__":
sc = serial.Serial('/dev/tty.usbmodem1421',timeout=None,baudrate=115200)
sc.flush()
while True:
#s=raw_input()
s=str(50)
if len(s) >0:
if s.isdigit():
sc.write(chr(int(s)))
time.sleep(1.0)
if sc.inWaiting()>0:
print(sc.read(sc.inWaiting()))
如果我把Python中的延时从1.0秒改成0.1秒,它就不会再工作了(收不到数据,只是等待状态)。
看起来您的 python 代码是这样做的:
- 发送命令
- 休眠一段时间(大概是为了让arduino有时间回复)
- 阅读回复
- 如果没有回复,从步骤1开始重复
您提到如果睡眠时间太短则不起作用。我想知道是否会发生以下情况。想象一下没有睡眠期。 python 代码将立即检查是否有回复,该回复可能不存在,因为 arduino 还没有来得及回复。在这种情况下,它会立即尝试发送另一个命令。这可能会不断重复发生——python 代码可能会充斥着 arduino 无法跟上的请求。您可以使用睡眠时间来防止这种情况发生,但睡眠时间可能比 arduino 实际需要的时间更长,这会降低您的数据速率。
如果是这种情况,可以改为在 python 代码中执行此操作:
- 发送命令
- 等待arduino回复(但不使用睡眠)。理想情况下,使用阻塞直到接收到输入的读取命令。一个不太可取的替代方案是 busywait——进入一个循环,该循环只检查是否已收到回复并在输入可用时终止。
- 阅读回复
- 从第 1 步开始重复
其实我想做的是查询Arduino获取数据。当我从 Python 向 Arduino 发送命令时,Arduino 将根据查询关键字发回一些数据。我能够做到这一点,但速度非常低,我希望有一种更有效的方法来做到这一点,例如,每秒至少查询 100 次。任何的想法?谢谢!
我使用的代码:
Arduino:
int temp=1;
char s[2];
int speedIn=0;
void setup() {
Serial.begin(115200);
}
void loop() {
if(Serial.available()>0){
Serial.readBytes(s,1);
speedIn=int(s[0]);
if(speedIn==49){
Serial.println(">Data1Send<");
speedIn=0;
}
else if(speedIn==50){
Serial.print(">");
Serial.print(temp);
Serial.println("<");
speedIn=0;
}
else{
Serial.println(">Wrong Data<");
speedIn=0;
}
}
if(temp<300){
temp=temp+1;
}
//delay(100);
}
Python:
import serial
import time
if __name__=="__main__":
sc = serial.Serial('/dev/tty.usbmodem1421',timeout=None,baudrate=115200)
sc.flush()
while True:
#s=raw_input()
s=str(50)
if len(s) >0:
if s.isdigit():
sc.write(chr(int(s)))
time.sleep(1.0)
if sc.inWaiting()>0:
print(sc.read(sc.inWaiting()))
如果我把Python中的延时从1.0秒改成0.1秒,它就不会再工作了(收不到数据,只是等待状态)。
看起来您的 python 代码是这样做的:
- 发送命令
- 休眠一段时间(大概是为了让arduino有时间回复)
- 阅读回复
- 如果没有回复,从步骤1开始重复
您提到如果睡眠时间太短则不起作用。我想知道是否会发生以下情况。想象一下没有睡眠期。 python 代码将立即检查是否有回复,该回复可能不存在,因为 arduino 还没有来得及回复。在这种情况下,它会立即尝试发送另一个命令。这可能会不断重复发生——python 代码可能会充斥着 arduino 无法跟上的请求。您可以使用睡眠时间来防止这种情况发生,但睡眠时间可能比 arduino 实际需要的时间更长,这会降低您的数据速率。
如果是这种情况,可以改为在 python 代码中执行此操作:
- 发送命令
- 等待arduino回复(但不使用睡眠)。理想情况下,使用阻塞直到接收到输入的读取命令。一个不太可取的替代方案是 busywait——进入一个循环,该循环只检查是否已收到回复并在输入可用时终止。
- 阅读回复
- 从第 1 步开始重复