UART2(GPIO17-TX、GPIO18-RX),适配 LD2402 出厂正常工作模式(无目标输出OFF、有目标输出distance:XX),实现1 秒固定定时读取数据,过滤无效空数据后通过 USB 串口格式化打印,程序采用非阻塞millis()实现定时,不占用 CPU 资源,通信稳定无丢包。

一、核心配置说明

  1. 串口引脚:UART2 TX=GPIO17、RX=GPIO18(与你测试一致,无需改接线);
  2. 波特率:LD2402 默认115200(按你补充要求修改,适配出厂固件);
  3. 定时规则:严格 1 秒读取 1 次,避免数据刷屏,非阻塞实现不影响后续扩展;
  4. 数据格式:完全匹配 LD2402 出厂正常模式(OFF/distance:XX)。

二、硬件接线(与之前完全一致,无需改动)

保持 UART2 交叉接线、3.3V 供电、共地,直接复用测试后的接线即可:

HLK-LD2402 引脚

ESP32S3 引脚

接线说明

VCC

3.3V

严格 3.3V,禁止 5V(避免烧模块)

GND

GND

必须共地,否则串口通信异常

TX

GPIO18

LD2402 TX → ESP32S3 UART2 RX

RX

GPIO17

LD2402 RX → ESP32S3 UART2 TX

EN

悬空 / 3.3V

悬空即可正常工作

三、完整可运行程序

UART2 测试程序配置完全兼容:

/*
  ESP32S3 UART2 读取LD2402(出厂正常模式)
  功能:1秒定时读取数据,USB串口格式化打印
  配置:UART2(TX=17/RX=18),波特率115200(LD2402默认)
  数据格式:无目标→OFF | 有目标→distance:XX(cm)
  定时方式:非阻塞millis(),1秒固定读取一次
*/
#include <Arduino.h>

// 串口配置
#define UART2_TX        17    // ESP32 TX → LD2402 RX
#define UART2_RX        18    // ESP32 RX ← LD2402 TX
#define LD2402_BAUD     115200  // ✅ LD2402 
#define USB_BAUD        115200

// 非阻塞定时
unsigned long lastRead = 0;
#define READ_INTERVAL   300  // 300ms读一次,足够灵敏

void setup() {
  Serial.begin(USB_BAUD);
  delay(100);  
  // 初始化 UART2
  Serial2.begin(LD2402_BAUD, SERIAL_8N1, UART2_RX, UART2_TX);
  
  Serial.println("===== LD2402 启动 =====");
  Serial.println("接线:ESP32-TX17 → LD2402-RX");
  Serial.println("      ESP32-RX18 ← LD2402-TX");
}

void loop() {
  if (millis() - lastRead >= READ_INTERVAL) {
    lastRead = millis();
    readLD2402();
  }
}

// 正确读取 LD2402 文本模式数据
void readLD2402() {
  if (!Serial2.available()) return;

  String data = Serial2.readStringUntil('\n');
  data.trim();

  Serial.print("原始数据:"); Serial.println(data);

  if (data == "OFF") {
    Serial.println("状态:无目标 🚫");
  }
  else if (data.startsWith("distance:")) {
    // 提取距离
    float dis = data.substring(9).toFloat();

    Serial.print("✅ 检测到目标!距离:");
    Serial.print(dis);
    Serial.println(" cm");
  }

  Serial.println("---------------------------");
}

四、程序核心特性

  1. 严格 1 秒定时:采用millis()非阻塞定时,替代delay(),定时期间 CPU 可处理其他逻辑,方便后续扩展(如联动 WS2812、HC-SR501);
  2. 只取最新数据:读取前先清空 UART2 接收缓冲区,避免旧数据堆积,确保每次读取的是 LD2402 最新的检测结果;
  3. 数据过滤:自动去除无效字符、过滤空数据,避免解析异常,提升程序稳定性;
  4. 格式化打印:附带读取时间戳(程序运行秒数)、原始数据、解析结果,直观易读,方便调试;
  5. 量程验证:针对 LD2402 0-800cm 有效测距范围,过滤无效距离值,避免误显示;
  6. 无额外库依赖:基于 ESP32 Arduino 原生硬件串口,无需安装SoftwareSerial,与你测试的 UART2 程序完全兼容。

五、编译与测试步骤

  1. 保持硬件接线不变,确保 LD2402 3.3V 供电、GND 共地、TX/RX 交叉接 GPIO18/17;
  2. 打开 Arduino IDE,复制上述程序,选择开发板「ESP32S3 Dev Module」和对应 USB 串口;
  3. 点击「编译 / 上传」,无编译错误(已适配 UART2 硬件特性);
  4. 打开 Arduino 串口监视器,配置参数必须严格匹配:
    • 波特率:115200
    • 换行符:勾选「自动换行」(无需勾选「显示行尾」);
  1. 测试效果:串口监视器每 1 秒刷新一次 LD2402 检测结果,无目标显示OFF,有目标显示具体距离。

六、串口监视器显示效果示例

===== LD2402 启动 =====
接线:ESP32-TX17 → LD2402-RX
      ESP32-RX18 ← LD2402-TX
原始数据:distance:102
---------------------------
原始数据:distance:100
✅ 检测到目标!距离:100.00 cm
---------------------------
原始数据:distance:91
✅ 检测到目标!距离:91.00 cm
---------------------------
原始数据:distance:91
✅ 检测到目标!距离:91.00 cm
---------------------------
原始数据:distance:88
✅ 检测到目标!距离:88.00 cm
--------------------------------------------------------

七、关键参数修改(按需调整)

若需修改读取间隔、波特率,直接修改宏定义即可,无需改动核心逻辑:

// 改为2秒读取一次
#define READ_INTERVAL   2000
// 若LD2402波特率被修改,可在此调整(出厂默认115200,不建议改)
#define LD2402_BAUD     9600

八、常见问题排查(基于 UART2 已测试正常)

若程序运行后无数据 / 数据异常,按以下优先级排查(UART2 硬件已验证,问题多在模块 / 接线):

  1. LD2402 供电是否为 3.3V:接 5V 会烧毁模块,无任何数据输出,这是最常见问题;
  2. 是否为出厂正常模式:若模块被刷写过自定义固件,输出格式会改变,需恢复出厂固件;
  3. 缓冲区是否为空:若打印「无有效数据」,检查 LD2402 是否正常工作(通电后指示灯是否闪烁);
  4. 接线是否松动:重点检查 GPIO18(UART2 RX)与 LD2402 TX 的连接,虚接会导致无数据;
  5. 波特率是否匹配:确保程序中LD2402_BAUD=115200,与 LD2402 出厂默认一致。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐