diff --git a/README.md b/README.md index 5c5719e..cc9a57f 100755 --- a/README.md +++ b/README.md @@ -105,8 +105,8 @@ void setup() // use Serial (port 0); initialize Modbus communication baud rate Serial.begin(19200); - // communicate with Modbus slave ID 2 over Serial (port 0) - node.begin(2, Serial); + // communicate with Modbus slave ID 2 over Serial (port 0), with a 1-second timeout + node.begin(2, Serial, 1000); } diff --git a/src/ModbusMaster.cpp b/src/ModbusMaster.cpp index 4169e58..1ec7754 100644 --- a/src/ModbusMaster.cpp +++ b/src/ModbusMaster.cpp @@ -56,13 +56,15 @@ Call once class has been instantiated, typically within setup(). @param slave Modbus slave ID (1..255) @param &serial reference to serial port object (Serial, Serial1, ... Serial3) +@param u16MBResponseTimeout Modbus timeout in milliseconds (default 2000) @ingroup setup */ -void ModbusMaster::begin(uint8_t slave, Stream &serial) +void ModbusMaster::begin(uint8_t slave, Stream &serial, uint16_t u16MBResponseTimeout = ModbusMaster::ku16MBResponseTimeout) { // txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t)); _u8MBSlave = slave; _serial = &serial; + _u16MBResponseTimeout = u16MBResponseTimeout; _u8TransmitBufferIndex = 0; u16TransmitBufferLength = 0; @@ -797,7 +799,7 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) break; } } - if ((millis() - u32StartTime) > ku16MBResponseTimeout) + if ((millis() - u32StartTime) > _u16MBResponseTimeout) { u8MBStatus = ku8MBResponseTimedOut; } diff --git a/src/ModbusMaster.h b/src/ModbusMaster.h index 8c433e6..3632a99 100644 --- a/src/ModbusMaster.h +++ b/src/ModbusMaster.h @@ -71,7 +71,7 @@ class ModbusMaster public: ModbusMaster(); - void begin(uint8_t, Stream &serial); + void begin(uint8_t, Stream &serial, uint16_t u16MBResponseTimeout); void idle(void (*)()); void preTransmission(void (*)()); void postTransmission(void (*)()); @@ -219,6 +219,7 @@ class ModbusMaster private: Stream* _serial; ///< reference to serial port object + uint16_t _u16MBResponseTimeout; ///< Modbus timeout [milliseconds] uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in begin() static const uint8_t ku8MaxBufferSize = 64; ///< size of response/transmit buffers uint16_t _u16ReadAddress; ///< slave register from which to read @@ -248,8 +249,8 @@ class ModbusMaster static const uint8_t ku8MBMaskWriteRegister = 0x16; ///< Modbus function 0x16 Mask Write Register static const uint8_t ku8MBReadWriteMultipleRegisters = 0x17; ///< Modbus function 0x17 Read Write Multiple Registers - // Modbus timeout [milliseconds] - static const uint16_t ku16MBResponseTimeout = 2000; ///< Modbus timeout [milliseconds] + // Default Modbus timeout [milliseconds] + static const uint16_t ku16MBResponseTimeout = 2000; ///< Default Modbus timeout [milliseconds] // master function that conducts Modbus transactions uint8_t ModbusMasterTransaction(uint8_t u8MBFunction);