diff --git a/README.md b/README.md index 5c5719e..eb47613 100755 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ Registers Both full-duplex and half-duplex RS232/485 transceivers are supported. Callback functions are provided to toggle Data Enable (DE) and Receiver Enable (/RE) pins. +The response timeout (default 2000 ms) can be set with `setResponseTimeout(ms)` after `begin()`, e.g. to fail sooner when no slave is present. + ## Installation diff --git a/keywords.txt b/keywords.txt index cf50a0a..d226fce 100644 --- a/keywords.txt +++ b/keywords.txt @@ -17,6 +17,7 @@ highWord KEYWORD2 LONG KEYWORD2 begin KEYWORD2 +setResponseTimeout KEYWORD2 getResponseBuffer KEYWORD2 clearResponseBuffer KEYWORD2 diff --git a/src/ModbusMaster.cpp b/src/ModbusMaster.cpp index 4169e58..29d782e 100644 --- a/src/ModbusMaster.cpp +++ b/src/ModbusMaster.cpp @@ -46,6 +46,7 @@ ModbusMaster::ModbusMaster(void) _idle = 0; _preTransmission = 0; _postTransmission = 0; + _u16ResponseTimeoutMs = ku16MBResponseTimeout; } /** @@ -73,6 +74,12 @@ void ModbusMaster::begin(uint8_t slave, Stream &serial) } +void ModbusMaster::setResponseTimeout(uint16_t ms) +{ + _u16ResponseTimeoutMs = ms; +} + + void ModbusMaster::beginTransmission(uint16_t u16Address) { _u16WriteAddress = u16Address; @@ -797,7 +804,7 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) break; } } - if ((millis() - u32StartTime) > ku16MBResponseTimeout) + if ((millis() - u32StartTime) > _u16ResponseTimeoutMs) { u8MBStatus = ku8MBResponseTimedOut; } diff --git a/src/ModbusMaster.h b/src/ModbusMaster.h index 8c433e6..0d767dd 100644 --- a/src/ModbusMaster.h +++ b/src/ModbusMaster.h @@ -217,6 +217,14 @@ class ModbusMaster uint8_t readWriteMultipleRegisters(uint16_t, uint16_t, uint16_t, uint16_t); uint8_t readWriteMultipleRegisters(uint16_t, uint16_t); + /** + * Set response timeout in milliseconds. + * Default is 2000 ms after begin(). Use a shorter value (e.g. 500) to fail + * sooner when no slave is present and reduce main loop blocking. + * @param ms timeout in milliseconds + */ + void setResponseTimeout(uint16_t ms); + private: Stream* _serial; ///< reference to serial port object uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in begin() @@ -249,8 +257,8 @@ class ModbusMaster 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] - + static const uint16_t ku16MBResponseTimeout = 2000; ///< default + uint16_t _u16ResponseTimeoutMs; ///< runtime timeout // master function that conducts Modbus transactions uint8_t ModbusMasterTransaction(uint8_t u8MBFunction);