hi, everyone
i used Arduino Uno.
I implemented the Modbus server using the Arduino Modbus library.
but, It begins well, but not configure.
My code is below.
#include <ArduinoModbus.h>
const int numInputRegisters = 10;
void setup (void)
{
Serial1.begin(9600);
Serial1.println("Serial Start!");
// start the Modbus RTU server, with (slave) id 4
if (!ModbusRTUServer.begin(4, 57600)) {
Serial1.println("Failed to start Modbus RTU Server!");
while (1);
}
// configure input registers at address 0x00
if(ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters) == 0)
{
Serial1.println("Successed to Configure");
}
else
{
Serial1.println("Failed to Configure");
}
}
"Failed to Configure" is displayed on the serial monitor.
pylon
2
i used Arduino Uno.
I implemented the Modbus server using the Arduino Modbus library.
The ArduinoModbus library is a bad choice for AVR Arduinos (UNO is an AVR Arduino) as it is rather lavish in memory usage.
if(ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters) == 0)
configureInputRegisters() returns 1 in case of success.
According to ArduinoModbus - Arduino Reference,
0 is a success and 1 is a failure.
pylon
4
The documentation seems to be wrong:
int ModbusServer::configureInputRegisters(int startAddress, int nb)
{
if (startAddress < 0 || nb < 1) {
errno = EINVAL;
return -1;
}
size_t s = sizeof(_mbMapping.tab_input_registers[0]) * nb;
_mbMapping.tab_input_registers = (uint16_t*)realloc(_mbMapping.tab_input_registers, s);
if (_mbMapping.tab_input_registers == NULL) {
_mbMapping.start_input_registers = 0;
_mbMapping.nb_input_registers = 0;
return 0;
}
memset(_mbMapping.tab_input_registers, 0x00, s);
_mbMapping.start_input_registers = startAddress;
_mbMapping.nb_input_registers = nb;
return 1;
}
0 is returned if the memory for the registers couldn't be allocated. If you got the memory 1 is returned.