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

如何使用ESP32通过ModBus读取MD02(SHT20)传感器寄存器?

MD02(SHT20)Modbus通信无响应问题排查与解决

核心问题定位方向

结合你的描述和代码,最可能的问题集中在RS485半双工控制、通信参数不匹配、Modbus请求帧正确性这三个方面,按以下步骤逐一排查:

1. 必须处理RS485模块的DE/RE引脚(最关键)

你使用的HW0519是RS485转TTL模块,Modbus RTU是半双工通信,必须通过DE/RE引脚切换收发模式,否则无法正常发送/接收数据:

  • 将HW0519的DE和RE引脚接同一个ESP32 GPIO(比如GPIO2,两者通常短接使用)
  • 修改代码添加引脚控制:
    #define RXD2 16
    #define TXD2 17
    #define DE_RE_PIN 2 // 新增DE/RE控制引脚
    
    byte ByteArray[250];
    int ByteData[20];
    
    void setup() {
      Serial.begin(9600);
      Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
      pinMode(DE_RE_PIN, OUTPUT);
      digitalWrite(DE_RE_PIN, LOW); // 默认处于接收模式
    }
    
    void loop() {
      delay(1000);
    
      byte msg[] = {0x01,0x04,0x00,0x01,0x00,0x01,0x60,0x0A};
      int len = sizeof(msg)/sizeof(msg[0]);
    
      Serial.println("Sending Data...");
      // 切换到发送模式
      digitalWrite(DE_RE_PIN, HIGH);
      for(int i=0 ; i < len ; i++){
        Serial2.write(msg[i]);
        Serial.print("[");
        Serial.print(i);
        Serial.print("]=");
        Serial.print(String(msg[i],HEX));
      }
      Serial2.flush(); // 等待所有字节发送完成
      delay(10); // 确保发送完成,避免切换过早丢失数据
      digitalWrite(DE_RE_PIN, LOW); // 切回接收模式
    
      Serial.println("\n\nReceiving Data...");
      unsigned long timeout = millis() + 100; // 设置100ms超时
      int a = 0;
      // 带超时的响应读取,避免漏读
      while(millis() < timeout && a < sizeof(ByteArray)){
        if(Serial2.available()){
          ByteArray[a] = Serial2.read();
          Serial.print("[");
          Serial.print(a);
          Serial.print("]=");
          Serial.print(String(ByteArray[a],HEX));
          Serial.print(" ");
          a++;
        }
      }
      Serial.println("\n");
    }
    

2. 确认通信参数完全匹配

  • 检查传感器默认的波特率、奇偶校验、停止位:部分MD02系列模块默认波特率可能是4800而非9600,或者带奇偶校验(比如偶校验),必须和代码中的Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2)完全一致
  • 确认传感器的从站地址:你当前用的是0x01,若模块默认地址不是0x01,请求会被忽略。可以用Modbus Poll的“Slave ID Scanner”功能扫描地址范围1-10,找到正确的从站地址

3. 验证Modbus请求帧的正确性

  • 检查寄存器地址:XY-MD02的温度寄存器通常是0x0000,湿度是0x0001,你当前请求的是0x0001(湿度),如果要读温度,需要把帧改成0x01,0x04,0x00,0x00,0x00,0x01,0x31,0xCA(CRC已重新计算)
  • 验证CRC校验:用Modbus CRC16计算器核对你发送的帧,确保最后两个字节的CRC值正确,错误的CRC会导致传感器直接丢弃请求

4. 硬件接线细节检查

  • RS485的A、B线不能接反:HW0519的A对应传感器的A,B对应传感器的B,接反会导致信号无法传输
  • 若通信距离超过10米,在RS485总线两端(传感器和HW0519侧)各接一个120Ω终端电阻,提升信号稳定性
  • 确认HW0519的供电电压符合要求(通常是5V),电压不足会导致通信异常

内容的提问来源于stack exchange,提问作者renaldyks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:35:46