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 代码是这样做的:

  1. 发送命令
  2. 休眠一段时间(大概是为了让arduino有时间回复)
  3. 阅读回复
  4. 如果没有回复,从步骤1开始重复

您提到如果睡眠时间太短则不起作用。我想知道是否会发生以下情况。想象一下没有睡眠期。 python 代码将立即检查是否有回复,该回复可能不存在,因为 arduino 还没有来得及回复。在这种情况下,它会立即尝试发送另一个命令。这可能会不断重复发生——python 代码可能会充斥着 arduino 无法跟上的请求。您可以使用睡眠时间来防止这种情况发生,但睡眠时间可能比 arduino 实际需要的时间更长,这会降低您的数据速率。

如果是这种情况,可以改为在 python 代码中执行此操作:

  1. 发送命令
  2. 等待arduino回复(但不使用睡眠)。理想情况下,使用阻塞直到接收到输入的读取命令。一个不太可取的替代方案是 busywait——进入一个循环,该循环只检查是否已收到回复并在输入可用时终止。
  3. 阅读回复
  4. 从第 1 步开始重复