Raspberry和Arduino来回交谈

时间:2018-08-06 20:49:38

标签: python arduino raspberry-pi

我正在一个项目中,我正在使用Arduino模拟将连接到Raspberry的另一台设备。我设法做到了让Raspberry控制Arduino(通过以Pi控制的模式闪烁一些LED)。现在,我正在寻找来回交换数据的方法,并为Pi和Arduino编写了程序,应该让它们接收一个数字,然后在该数字上加1并发送回去。

Raspberry Pi:

import serial
import time 
ser = serial.Serial('/dev/ttyACM0',9600)
time.sleep(1)
var = b'0'
var2 = b'1'
while 1:
    time.sleep(0.5)
    ser.write(var)
    var = ser.read(ser.inWaiting()) #Wait for Arduino to respond
    print(var)
    var = var + var2
    print('2') #Check print

Arduino:

const int ledPin = 12;
const int ledPin2 = 11;
int n;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin2, LOW);
  Serial.begin(9600);
  n = 0;
}

void loop() {
  while(Serial.available() == 0){
    digitalWrite(ledPin, HIGH); //Check LED
  }
  n = Serial.read() - '0';
  digitalWrite(ledPin, LOW);
  n = n + 1;
  Serial.print(n);
}

在python中输出的结果是:

b''
2
b'1'
2
b'2'
2
b'22'
2
b'32'
2
b'332'
2
b'432'
2

以此类推。这并不是我期望的顺序(1,3,5,7,9,11 ...因为我们从0开始并在Arduino添加后打印)。

希望有人可以提供帮助。预先谢谢^^

1 个答案:

答案 0 :(得分:0)

ser.read可能返回一个字符串,该字符串会导致(例如)"1" + "2"(又名"12")。将其包装在int()中:var = int(ser.read(ser.inWaiting()))

Arduino代码也会阻塞超过一位的数字;有关如何从串行读取int的信息,请参见https://www.arduino.cc/en/Tutorial.StringToIntExample。基本上,继续阅读并将其添加到字符串的末尾,直到您碰到终止符(本示例使用换行符),然后在该字符串上调用.toInt()

您还可以使用类似以下的内容,它可能会更有效,但可读性肯定较低:

while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
        int inNum = inChar - '0';
        n = n*10 + inNum;
    } else {
        // if inChar is NOT a digit
    }
}