My final code for reading data from slave:
#include <ModbusMaster.h>
#include <SoftwareSerialParity.h>
// Construct software serial object for Modbus/PC
const int SSRxPin = 10; // Recieve pin for software serial
const int SSTxPin = 11; // Send pin for software serial
SoftwareSerialParity SoftSerial(SSRxPin, SSTxPin);
#define MAX485_DE 9
#define MAX485_RE_NEG 8
// 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);
// Turn On Main/Hardware Serial Port
Serial.begin(9600,SERIAL_8N1);
// Serial1.begin(9600,SERIAL_8E1);
// Turn on Soft serial port
SoftSerial.begin(9600,EVEN);
// NOTE: SoftwareSerial only supports 8N1
// NOTE: SoftwareSerialParity library support all parity
// Start the Modbus instance with Modbus slave ID 10 and Soft Serial port
node.begin(10, SoftSerial);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t j, result;
uint16_t data[2];
// slave: read (2) 16-bit registers starting at register 33 to RX buffer
result = node.readHoldingRegisters(33, 2);
// do something with data if read is successful
if (result == node.ku8MBSuccess)
{
for (j = 0; j < 2; j++)
{
data[j] = node.getResponseBuffer(j);
}
Serial.print(data[0]);
}
SoftSerial.flush();
}