python - 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 添加时打印)。
希望有人能提供帮助。提前谢谢你^^
解决方案
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
}
}
推荐阅读
- python - 如何在 Django 中编辑用户配置文件
- xcode - 加载 mlmodel 时出现机器学习错误“No known class for loading model type > MLModelType_pipelineClassifier”
- node.js - Sequelize:聚合嵌套包含(PostgreSQL)
- vhdl - lattice mackXO3板输出瞬态
- jquery - bootstrap 4 + jQuery - 在移动设备上更改背景外观
- php - 电子邮件以状态 4.4.7 退回
- css - z-index 忽略最大高度并始终排在首位
- mysql - MySQL - 修复我性能不佳的更新?
- android - 有没有办法在推送通知接收时将应用程序带到前台?
- c++ - c++\CLI dll 包装器调用 c++ 类中的虚拟成员