关于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连接超时的原因

相关