Python和Arduino串行通信:发送和接收

时间:2016-05-30 18:21:29

标签: python arduino pyserial

我想要做的是实际查询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秒,它将不再起作用(无法接收数据且只处于等待状态)。

1 个答案:

答案 0 :(得分:0)

看起来你的python代码就是这样:

  1. 发送命令
  2. 睡了一段时间(大概是为了让arduino有时间回复)
  3. 阅读回复
  4. 如果没有回复,请从步骤1开始重复
  5. 你提到如果睡眠时间太短,它就不起作用。我想知道以下情况是否会发生。想象一下,没有睡眠期。 python代码将立即检查回复,这可能不存在,因为arduino没有时间回复。在这种情况下,它会立即尝试发送另一个命令。这可能会反复发生 - python代码可能会使arduino无法跟上的请求泛滥成灾。你可以使用休眠期防止这种情况发生,但睡眠时间可能比arduino实际需要的时间长,这会降低你的数据速率。

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

    1. 发送命令
    2. 等待arduino回复(但不使用睡眠)。理想情况下,使用一个阻塞的读命令,直到收到输入。一个不太优选的替代方案是busywait - 输入一个循环,除了检查是否已收到回复之外什么都不做,并在输入可用时终止。
    3. 阅读回复
    4. 从第1步开始重复