关于modbus RTU的一个问题
出现超时错误
当前电路接法可以正常实现RS485通信
#include#include #include #define RX_PIN 13 #define TX_PIN 15 RS485Class RS485(Serial2, RX_PIN, TX_PIN,-1); uint16_t x = 0; int i = 0; void setup() { M5.begin(true,true,true); if (!ModbusRTUClient.begin(9600, SERIAL_8E1)) { Serial.println("Failed to start Modbus RTU Client!"); return; } } void loop() { if(i<3 &&!ModbusRTUClient.holdingRegisterWrite(7,1,x)){ Serial.print("Failed to write holdingRegister! "); Serial.println(ModbusRTUClient.lastError()); } x++; i++; delay(1000); }
下为modbus slave结果
下为modbus slave的配置
另外:
1.官网的M5 stack IoT BASE NB ModBus RTU Master例程,没法正常运行,相关库版本如下
下为官网例程
#include#include #include #include "IoT_BASE_SIM7020.h" RS485Class RS485(Serial2, IoT_BASE_RS485_RX, IoT_BASE_RS485_TX, -1, -1); void setup() { M5.begin(); if (!ModbusRTUClient.begin(9600, SERIAL_8N1)) { Serial.println("Failed to start Modbus RTU Client!"); while (1) ; } } void loop() { // for (slave) id 1: write the value of 0x01, to the coil at address 0x00 if (!ModbusRTUClient.coilWrite(1, 0x00, 0xff)) { Serial.print("Failed to write coil! "); Serial.println(ModbusRTUClient.lastError()); } // wait for 1 second delay(2000); // for (slave) id 1: write the value of 0x00, to the coil at address 0x00 if (!ModbusRTUClient.coilWrite(1, 0x00, 0x00)) { Serial.print("Failed to write coil! "); Serial.println(ModbusRTUClient.lastError()); } // wait for 1 second delay(2000); }
下为编译报错提示
我将例程中,下面这行
的参数去掉了一个-1,并且将RS485.cpp中的RS485的定义注释掉,如下
这样例程可以顺利编译,不知道这里的操作是否是造成最上面modbus RTU连接超时的原因