Según altos estándares industriales


This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.


Modbus RS485 - good data back but the code is not picking it up

brandon wiewel
en 2/5/19 0:26 515 vistas

I have sniffed the data to and from the M21+ and i have valid data going out and coming back but the M21+ is not recognizing it.  I have attached what is basically the example code. Can anyone see anything wrong with the Rx portion?

I am on Z and Y and have half duplex switch set to on.  again validated i have a good modbus string leaving and coming to the M21+. 

sniffed data

SENT - 01 03 00 05 00 03 15 CA

Returned - 01 03 06 00 00 00 44 00 00 61 60

At this point this if statment is not firing:   " if (modbus.isWaitingResponse())  "


#include <ModbusRTUMaster.h>

// Define the ModbusRTUMaster object, using the RS-485 or RS-232 port (depending on availability)

#include <RS485.h>

ModbusRTUMaster modbus(RS485);

uint32_t lastSentTime = 0UL;

const uint32_t baudrate = 9600;

bool Dig1State = 0;


void setup() {


  Serial.println("Modbus starting...");


  // Start the serial port

  RS485.begin(baudrate, HALFDUPLEX, SERIAL_8N1);

  // Start the modbus master object.

  // It is possible to define the port rate (default: 38400)


  pinMode(Q0_1, OUTPUT);



  Serial.println("Loop start...");



void loop() {

  // Send a request every 1000ms

  if (millis() - lastSentTime > 2000) {


    Dig1State = !Dig1State;

    digitalWrite(Q0_1, Dig1State);


    Serial.println("Modbus poll...");

    // Send a Read Coils request to the slave with address 1

    // It requests for 23 coils starting at address 10

    // IMPORTANT: all read and write functions start a Modbus transmission, but they are not

    // blocking, so you can continue the program while the Modbus functions work. To check for

    // available responses, call master.available() function often.

    modbus.readHoldingRegisters( 1 , 5, 3);

    lastSentTime = millis();


  // Check available responses often

  if (modbus.isWaitingResponse()) {

    ModbusResponse response = modbus.available();

    if (response) {

      Serial.println("Modbus responce...");

      if (response.hasError()) {

        // Response failure treatment. You can use response.getErrorCode()

        Serial.print("Modbus Comm Error");


      else {

        // Get the coil value from the response

        for (int i = 0; i < 3; ++i) {


          Serial.print("- ");






} //loop

Industrial Shields Forum user

Dani Salvans Quesada

--Dani Salvans Quesada--

| 0 0 0
Sant Fruitós de Bages, España
--Dani Salvans Quesada--
Dani Salvans Quesada
En 25/8/20 20:28

Hello friend, 

Maybe the !modbus.isWaitingResponse() is not used in the right situation, you can check it and compare it with this example: Or you can adapt this example and try it directly.

Thank you, 


Mantener informado

Acerca de esta comunidad

Esta comunidad es para profesionales y entusiastas de nuestros productos y servicios, compartir los mejores contenidos y nuevas ideas de marketing, construir su perfil profesional y mejorar el mercado para todos. Lea los lineamientos

Herramientas de las preguntas

5 seguidor(es)


Preguntado: 2/5/19 0:26
Visto: 515 veces
Última actualización: 25/8/20 20:28