diff --git a/src/ModbusRTUServer.cpp b/src/ModbusRTUServer.cpp index 7c4dfb9..db3a092 100644 --- a/src/ModbusRTUServer.cpp +++ b/src/ModbusRTUServer.cpp @@ -34,7 +34,7 @@ ModbusRTUServerClass::~ModbusRTUServerClass() { } -int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config) +int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config, unsigned max_req_size) { modbus_t* mb = modbus_new_rtu(baudrate, config); @@ -43,13 +43,14 @@ int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config) } modbus_connect(mb); + _max_request_size = max_req_size; return 1; } void ModbusRTUServerClass::poll() { - uint8_t request[MODBUS_RTU_MAX_ADU_LENGTH]; + uint8_t request[_max_request_size]; int requestLength = modbus_receive(_mb, request); diff --git a/src/ModbusRTUServer.h b/src/ModbusRTUServer.h index 82cd885..7e92a18 100644 --- a/src/ModbusRTUServer.h +++ b/src/ModbusRTUServer.h @@ -21,6 +21,7 @@ #define _MODBUS_RTU_SERVER_H_INCLUDED #include "ModbusServer.h" +#include "libmodbus/modbus-rtu.h" class ModbusRTUServerClass : public ModbusServer { public: @@ -36,12 +37,14 @@ class ModbusRTUServerClass : public ModbusServer { * * Return 1 on success, 0 on failure */ - int begin(int id, unsigned long baudrate, uint16_t config = SERIAL_8N1); + int begin(int id, unsigned long baudrate, uint16_t config = SERIAL_8N1, unsigned max_req_size = MODBUS_RTU_MAX_ADU_LENGTH); /** * Poll interface for requests */ virtual void poll(); +private: + unsigned _max_request_size; }; extern ModbusRTUServerClass ModbusRTUServer; diff --git a/src/libmodbus/modbus.c b/src/libmodbus/modbus.c index acf5b10..cfc493d 100644 --- a/src/libmodbus/modbus.c +++ b/src/libmodbus/modbus.c @@ -497,7 +497,10 @@ int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type) if (length_to_read != 0) { step = _STEP_META; break; - } /* else switches straight to the next step */ + } + /* else switches straight to the next step */ + /* Silence compiler warning, do not remove the following comment. */ + /* fall through */ case _STEP_META: length_to_read = compute_data_length_after_meta( ctx, msg, msg_type);