我正在一个项目中,我正在使用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添加后打印)。
希望有人可以提供帮助。预先谢谢^^
答案 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
}
}