树莓派如何将Arduino传输的3路超声波传感器数据存为变量
解决方法
你现在无法拿到独立可调用变量的核心原因是两点:一是Arduino端串口输出格式不统一,难以解析;二是Python端仅做了整行打印,没有对字符串做拆分和类型转换。另外你贴出的Arduino代码本身存在语法缺失问题,直接编译无法运行,以下是修正后可直接实现需求的完整方案。
1. 修正Arduino端代码
原代码缺少引脚定义、变量声明,函数大括号未闭合,且输出内容混杂文本、分隔符不统一,不利于解析。修正后代码统一用逗号作为分隔符输出三个距离值,同时增加超时逻辑避免传感器无回波时程序卡死:
// 按实际接线修改对应引脚号 const int trigPin1 = 2; const int echoPin1 = 3; const int trigPin2 = 4; const int echoPin2 = 5; const int trigPin3 = 6; const int echoPin3 = 7; long duration1, duration2, duration3; float distance1, distance2, distance3; void setup() { Serial.begin(9600); pinMode(trigPin1, OUTPUT); pinMode(trigPin2, OUTPUT); pinMode(trigPin3, OUTPUT); pinMode(echoPin1, INPUT); pinMode(echoPin2, INPUT); pinMode(echoPin3, INPUT); } void loop() { // 读取1号传感器 digitalWrite(trigPin1, LOW); delayMicroseconds(2); digitalWrite(trigPin1, HIGH); delayMicroseconds(2); digitalWrite(trigPin1, LOW); duration1 = pulseIn(echoPin1, HIGH, 30000); distance1 = (duration1/2) / 29.1; // 读取2号传感器 digitalWrite(trigPin2, LOW); delayMicroseconds(2); digitalWrite(trigPin2, HIGH); delayMicroseconds(2); digitalWrite(trigPin2, LOW); duration2 = pulseIn(echoPin2, HIGH, 30000); distance2 = (duration2/2) / 29.1; // 读取3号传感器 digitalWrite(trigPin3, LOW); delayMicroseconds(2); digitalWrite(trigPin3, HIGH); delayMicroseconds(2); digitalWrite(trigPin3, LOW); duration3 = pulseIn(echoPin3, HIGH, 30000); distance3 = (duration3/2) / 29.1; // 按 距离1,距离2,距离3 格式输出,无多余文本 Serial.print(distance1); Serial.print(","); Serial.print(distance2); Serial.print(","); Serial.println(distance3); delay(100); }
注意:将上述代码中引脚号修改为你实际接线的针脚后,烧录到Arduino Uno即可。
2. 修正树莓派端Python代码
读取串口行后按逗号拆分字符串,转换为浮点型数值,即可得到三个独立可调用的变量,同时增加异常捕获避免串口传输出错时程序崩溃:
import serial if __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.reset_input_buffer() while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() if not line: continue try: # 拆分字符串并转成浮点数,得到三个独立变量 dist1, dist2, dist3 = map(float, line.split(',')) # 以下为变量调用示例,可替换为你的业务逻辑 print(f"1号传感器: {dist1:.1f}cm") print(f"2号传感器: {dist2:.1f}cm") print(f"3号传感器: {dist3:.1f}cm") print("-"*20) # 例:1号传感器检测到20cm内障碍物触发动作 if dist1 < 20: print("1号传感器检测到近距离障碍物!") except ValueError: # 数据解析失败时跳过当前行,避免程序退出 continue
关键说明
- 嵌入式串口传输时,优先使用单一简单分隔符(如逗号)输出纯数值,不要混杂冗余文本,能大幅降低解析出错概率
- 从串口读取的内容默认是字符串格式,必须转换为对应数值类型(int/float)才能做数值计算、逻辑判断
- 给
pulseIn增加超时参数是超声波传感器常用的容错方案,避免传感器未接收到回波时整个程序阻塞
内容的提问来源于stack exchange,提问作者GoldenBee
相关产品推荐
相关产品推荐

