You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:57:13