41浏览
查看: 41|回复: 1

[ESP8266/ESP32] 求助大佬,我的代码一直卡在读取传感器数据代码不运行

[复制链接]
#include <Arduino.h>
#include <ModbusMaster.h>

#define RS485_RX   16
#define RS485_TX   17

ModbusMaster node;

void setup() {
  Serial.begin(115200); // 用于打印输出到串口监视器

  Serial.println("Setup Start");

  Serial1.begin(115200, SERIAL_8N1, RS485_RX, RS485_TX); // 用于和485设备通讯
  node.begin(1, Serial1); // Modbus主站节点初始化

  Serial.println("Modbus RTU Wind Speed Sensor Test");
}

void loop() {

  Serial.println("Loop running...");  
  
  uint8_t result = node.readHoldingRegisters(0x0000, 1);

  
  if (result == node.ku8MBSuccess) {
    uint16_t windSpeedRaw = node.getResponseBuffer(0);
    float windSpeed = windSpeedRaw / 10.0f;
    Serial.print("Wind Speed: ");
    Serial.print(windSpeed);
    Serial.println(" m/s");
  } else {
    Serial.print("Modbus Error: ");
    Serial.println(result, HEX);
  }

  delay(1000);
}
这是代码
连线图大概是图片里的方式,只是芯片用的是esp32-wroom,电源模块直接用了12v的电源模块。
然后烧录程序之后我的串口监视器运行到Serial.println("Loop running...");
直接跳到Serial.print("Modbus Error: ");
             Serial.println(result, HEX);
然后串口输出一直是这样的:
---- 已打开串行端口 COM8 ----
Modbus Error: E2
Loop running...
Loop running1...
Modbus Error: E2
Loop running...
Loop running1...
Modbus Error: E2
Loop running...
Loop running1...
Modbus Error: E2
Loop running...
Loop running1...
Modbus Error: E2
Loop running...
Loop running1...
求助大佬,是哪里出了问题,要怎么解决啊?
FriJune-202506135123..png

风景旧曾谙  学徒
 楼主|

发表于 2 小时前

#include <Arduino.h>
#include <ModbusMaster.h>

// 引脚定义
#define TX1_PIN 17  // ESP32的TX引脚连接到MAX485的RX
#define RX1_PIN 16  // ESP32的RX引脚连接到MAX485的TX

// 定义风速查询命令 (Modbus RTU协议)
const uint8_t windSpeedQuery[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};

// 全局变量存储风速值
float wspeed = 0.0;

// Modbus RTU CRC 校验函数(确保数据完整性)
uint16_t modbusCRC(const uint8_t* data, uint8_t len) {
  uint16_t crc = 0xFFFF;
  for (uint8_t i = 0; i < len; i++) {
    crc ^= data[i];
    for (uint8_t j = 0; j < 8; j++) {
      crc = (crc & 0x0001) ? (crc >> 1) ^ 0xA001 : (crc >> 1);
    }
  }
  return crc;
}

// 初始化函数
void setup() {
  // 初始化串口通信,用于调试输出
  Serial.begin(115200);
  // 初始化与传感器通信的串口
  Serial1.begin(4800, SERIAL_8N1, RX1_PIN, TX1_PIN);
}

// 读取风速的函数
void ReadWindSpeed() {
  // 向风速传感器发送查询命令
  Serial1.write(windSpeedQuery, sizeof(windSpeedQuery));
  Serial1.flush();  // 确保所有数据都已发送

  // 等待传感器响应
  delay(1000);
// 等待数据到来(最多等1秒)
  unsigned long start = millis();
  while (!Serial1.available() && (millis() - start < 1000)) {
    delay(1); // 小延时防止跑飞
  }
  Serial.println("waiting for sensor response...");

  // 检查是否接收到数据
  if (Serial1.available()) {
    uint8_t buffer[128];
    Serial.println("checking data receiving...");

    // 读取响应数据
    int len = Serial1.readBytes(buffer, sizeof(buffer));
    Serial.print("reading response data, len = ");
    Serial.println(len);

    // 校验数据格式
    if (len > 0 && len == 9 && buffer[0] == 0x01 && buffer[1] == 0x03) {
      // 解析风速数据
      int fs10 = buffer[3] * 256 + buffer[4];  //将两个字节合并为 16 位整数
      wspeed = fs10 / 10.0;  // 转换为实际风速值(m/s)
      
      // 输出风速数据
      Serial.print("Wind Speed: ");
      Serial.print(wspeed);
      Serial.println(" m/s");
    } else {
      // 数据格式错误
      Serial.println("Failed to read wind speed - Invalid data format");
            for (int i = 0; i < len; i++) {
                 Serial.print(buffer[i], HEX);
                 Serial.print(" ");
                }
      Serial.println();
    }
  } else {
    // 无响应
    Serial.println("No response from wind speed sensor");
  }
  
  // 清空串口缓冲区
  while (Serial1.available()) {
    Serial1.read();
  }
}

// 主循环
void loop() {
  // 读取风速
  Serial.println("wspeed is uploading...");
  ReadWindSpeed();
  
  // 延时一段时间再次读取
  delay(5000);  // 每5秒读取一次
}
代码这样,从传感器读不到数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail