Python串口读取2个以上Arduino超声波传感器数据方法
多超声波传感器串口读取实现方案
你现有的单传感器读取逻辑完全可以扩展支持多传感器场景,核心问题是当前Arduino端仅输出单个裸数值,Python端无法区分数据归属的传感器,只要两端约定统一的传输格式即可实现。
注意:你现有Python代码中串口波特率写为9800,和Arduino端配置的9600不匹配,单传感器场景下能运行属于偶发兼容,多传感器场景下必须先修正该参数,否则会频繁出现乱码、数据解析失败问题。
Arduino端修改逻辑
给每个超声波传感器分配独立的Trig、Echo引脚,每次主循环依次轮询所有传感器,按照「传感器编号:距离值」的固定格式逐行输出数据即可,无需更换原有通信逻辑。
以2个传感器为例,修改后的代码如下:
// 传感器配置,新增传感器直接修改这部分参数即可 const int sensorTotal = 2; const int trigPins[] = {11, 9}; const int echoPins[] = {12, 10}; long duration; int cm; void setup() { Serial.begin(9600); // 批量初始化所有传感器引脚 for (int i = 0; i < sensorTotal; i++) { pinMode(trigPins[i], OUTPUT); pinMode(echoPins[i], INPUT); } } void loop() { // 依次读取每个传感器数据 for (int i = 0; i < sensorTotal; i++) { // 触发测距信号 digitalWrite(trigPins[i], LOW); delayMicroseconds(5); digitalWrite(trigPins[i], HIGH); delayMicroseconds(10); digitalWrite(trigPins[i], LOW); duration = pulseIn(echoPins[i], HIGH); cm = (duration / 2) / 29.1; // 按约定格式输出单条传感器数据,每行一条 Serial.print(i); Serial.print(":"); Serial.println(cm); } delay(250); }
烧录后打开串口监视器可以看到类似如下输出,每一行对应一个传感器的读数:
0:132 1:57
如果需要新增传感器,仅需把sensorTotal改为对应数量,在trigPins、echoPins数组中追加新的引脚编号即可,无需修改其他逻辑。
Python端修改逻辑
原有串口读取的核心逻辑不需要改动,只需要新增数据解析步骤,把每行内容拆分出传感器编号和对应距离值即可,修改后的代码如下:
import serial import time # 修正波特率和Arduino端保持一致,增加超时参数避免读取阻塞 ser = serial.Serial('COM7', 9600, timeout=1) time.sleep(2) # 字典存储所有传感器的最新读数 sensor_readings = {} try: while True: line = ser.readline() if not line: continue try: // 解码后去除首尾换行、空格等无效字符 raw_content = line.decode().strip() // 按约定的冒号分隔符拆分编号和数值 sensor_id, dist = raw_content.split(":") sensor_readings[int(sensor_id)] = int(dist) // 打印当前所有传感器数据 print("实时读数:", sensor_readings) except: // 串口偶发乱码、传输不完整时直接跳过,不中断主循环 pass except KeyboardInterrupt: // 手动按Ctrl+C退出时关闭串口 ser.close()
注意事项
- 超声波传感器工作峰值电流不低,传感器数量超过2个时不建议直接用Arduino板载5V引脚供电,最好外接独立电源共地,否则会出现读数跳变、传感器不工作的问题
pulseIn属于阻塞函数,传感器数量较多时整体采样延迟会升高,如果需要更高的采样频率,可以改用外部中断方式监听Echo引脚,普通课程项目场景下当前轮询写法足够使用- 调试阶段不要在串口输出中随意添加其他无关文本,严格遵守约定的数据格式,否则会导致Python端解析失败
内容的提问来源于stack exchange,提问作者joaquim
相关产品推荐
相关产品推荐

