首页 > 解决方案 > Raspberry 和 Arduino 来回交谈

问题描述

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

树莓派:

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

阿杜诺:

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 添加时打印)。

希望有人能提供帮助。提前谢谢你^^

标签: pythonarduinoraspberry-pi

解决方案


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
    }
}

推荐阅读