Modbus RS485 communication Through ATMEGAmega2560p

"'#include <ModbusMaster.h>

/*!
We're using a MAX485-compatible RS485 Transceiver.
Rx/Tx is hooked up to the hardware serial port at 'Serial'.
The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE 13
#define MAX485_RE_NEG 12

#define DEBUGON 1

// Transmission delay between modbus calls
#define XMITDELAY 1000

// 0 for 0-based, 1 for 1-based numbering
#define BASED_NUMBERING 1

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}

void setup()
{
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);

// Modbus communication runs at 115200 baud
Serial.begin(9600);
Serial2.begin(9600);

// Modbus slave ID 1
node.begin(1, Serial2);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}

bool state = true;

void loop()
{
uint16_t data[50];
Serial.println("Data Register of 143: ");
getHoldingRegisterData( 0143,2,data);
Serial.println();
delay(1000);
Serial.println("Data Register of 177: ");
getHoldingRegisterData( 27,10,data);
Serial.println();
node.clearResponseBuffer();
node.clearTransmitBuffer();
Serial2.flush();
Serial.flush();
}

bool getHoldingRegisterData(uint16_t registerAddress, uint16_t regSize, uint16_t* data){

uint8_t j, result, test;

if(DEBUGON){
/*Serial.print(F("Reading register: "));
Serial.print(registerAddress);
Serial.print(F(" regSize: "));
Serial.print(regSize);
Serial.print(F(" sizeof(data): "));
Serial.print(sizeof(&data));
Serial.print(F(" XMITDELAY: "));
Serial.println(XMITDELAY);
Serial.println(""); */
}

// Delay and get register data.

//result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
result = node.readHoldingRegisters(0x08F, 5);
Serial.print("Result is time 1: ");
Serial.println(result);
delay(XMITDELAY);

// LT is sleeping, ping it a couple more times.

if (result == node.ku8MBSuccess) {
if(DEBUGON){
Serial.print(F("LT: Success, Received data: "));
}

for (j = 0; j < regSize; j++) {

data[j] = node.getResponseBuffer(j);

if(DEBUGON){
  Serial.print(data[j], HEX);
  Serial.print(F(" "));
}

}

if(DEBUGON){
Serial.println("");
}

node.clearResponseBuffer();
node.clearTransmitBuffer();
return true;

}

if(result ==node.ku8MBResponseTimedOut){

    if(DEBUGON){
      Serial.println(F("LT: Response timed out. Trying again. "));
    }

int i =0;

while(i < 50){

  result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
  Serial.print("Result is time 2: ");
  Serial.println(result);
  delay(XMITDELAY);


  if(result == node.ku8MBResponseTimedOut){
    if(DEBUGON) Serial.println(F("LT: Failed. Response timed out. Adjust the XMITDELAY and/or ku8MBResponseTimeout? "));
  }
  else break;

  i++;

}

}

else{
if(DEBUGON){
Serial.print(F("Failed, Response Code: "));
Serial.println(result, HEX);
}
}

node.clearResponseBuffer();
node.clearTransmitBuffer();
return false;
} '''
My project is regarding to read the (Voltage,Load,Current )and so on..By using Multifunction meter connected with RS-485 through Arduino mega2560p.If anyone has worked on something like this, i would require you to help me.
I have facing issues in the above code can anybody help me through it. and please ensure that the above program is Right or not.'''

Please see How to get the best out of this forum and particularly "Hardware" and "Code Problems".

Exactly what issues are you having?

Iam not able to get the output as i expect ..can you help me to write the program for my project please ?

Ok, what output do you expect? We don't know what you want, unless you tell us.

Please READ and FOLLOW How to get the best out of this forum and particularly "Hardware" and "Code Problems".

I need the o/p as to serial print the values from holding registers which i have connected to the multifunction meter like load, current, voltage

I am not even looking at your code until you format it with code tags, maybe someone else can help.


my output page

#include <ModbusMaster.h>

/*!
  We're using a MAX485-compatible RS485 Transceiver.
  Rx/Tx is hooked up to the hardware serial port at 'Serial'.
  The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE      13
#define MAX485_RE_NEG  12


#define DEBUGON 1

// Transmission delay between modbus calls
#define XMITDELAY 1000

// 0 for 0-based, 1 for 1-based numbering
#define BASED_NUMBERING 1

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 115200 baud
  Serial.begin(9600);
  Serial2.begin(9600);

  // Modbus slave ID 1
  node.begin(1, Serial2);
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

bool state = true;

void loop()
{
 uint16_t data[50];
 Serial.println("Data Register of 143: ");
 getHoldingRegisterData( 0143,2,data); 
 Serial.println(); 
 delay(1000);
 Serial.println("Data Register of 177: ");
 getHoldingRegisterData( 27,10,data); 
 Serial.println();
 node.clearResponseBuffer();
 node.clearTransmitBuffer();
 Serial2.flush();
 Serial.flush();
}


bool getHoldingRegisterData(uint16_t registerAddress, uint16_t regSize, uint16_t* data){

uint8_t j, result, test;

if(DEBUGON){
  /*Serial.print(F("Reading register: "));
  Serial.print(registerAddress);
  Serial.print(F(" regSize: "));
  Serial.print(regSize);
  Serial.print(F(" sizeof(data): "));
  Serial.print(sizeof(&data));
  Serial.print(F(" XMITDELAY: "));
  Serial.println(XMITDELAY);
  Serial.println(""); */
}

// Delay and get register data.

//result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
result = node.readHoldingRegisters(0x08F, 5);
Serial.print("Result is time 1: ");
Serial.println(result);
delay(XMITDELAY);

// LT is sleeping, ping it a couple more times.

if (result == node.ku8MBSuccess) {
  if(DEBUGON){
    Serial.print(F("LT: Success, Received data: "));
  }

  for (j = 0; j < regSize; j++) {

    data[j] = node.getResponseBuffer(j);
   
    if(DEBUGON){
      Serial.print(data[j], HEX);
      Serial.print(F(" "));
    }
    
  }

  if(DEBUGON){
    Serial.println("");
  }

  node.clearResponseBuffer();
  node.clearTransmitBuffer();
  return true;

}


if(result ==node.ku8MBResponseTimedOut){

        if(DEBUGON){
          Serial.println(F("LT: Response timed out. Trying again. "));
        }

    int i =0;

    while(i < 50){

      result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
      Serial.print("Result is time 2: ");
      Serial.println(result);
      delay(XMITDELAY);

   
      if(result == node.ku8MBResponseTimedOut){
        if(DEBUGON) Serial.println(F("LT: Failed. Response timed out. Adjust the XMITDELAY and/or ku8MBResponseTimeout? "));
      }
      else break;

      i++;

    }

}


else{
  if(DEBUGON){
  Serial.print(F("Failed, Response Code: "));
  Serial.println(result, HEX);
  }
}

node.clearResponseBuffer();
node.clearTransmitBuffer();
return false;
}

I have been format it with code tags and also the output page. please check it and help me through it.