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... 求助大佬,是哪里出了问题,要怎么解决啊? |
#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秒读取一次 } 代码这样,从传感器读不到数据 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed