From f68185dc66b1a48dd09fe0c67d4e6884d16f2bb2 Mon Sep 17 00:00:00 2001 From: Karoly Czovek Date: Wed, 11 Feb 2026 18:28:49 +0100 Subject: [PATCH 1/2] Add setResponseTimeout() for configurable response timeout --- src/ModbusMaster.cpp | 3 ++- src/ModbusMaster.h | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ModbusMaster.cpp b/src/ModbusMaster.cpp index 4169e58..9922b57 100644 --- a/src/ModbusMaster.cpp +++ b/src/ModbusMaster.cpp @@ -46,6 +46,7 @@ ModbusMaster::ModbusMaster(void) _idle = 0; _preTransmission = 0; _postTransmission = 0; + _u16ResponseTimeoutMs = ku16MBResponseTimeout; } /** @@ -797,7 +798,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..953c45c 100644 --- a/src/ModbusMaster.h +++ b/src/ModbusMaster.h @@ -217,6 +217,9 @@ 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 2000). Use e.g. 500 for faster fail when no slave is present. */ + void setResponseTimeout(uint16_t ms) { _u16ResponseTimeoutMs = ms; } + private: Stream* _serial; ///< reference to serial port object uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in begin() @@ -249,7 +252,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; ///< Modbus timeout [milliseconds] (default) + uint16_t _u16ResponseTimeoutMs; ///< runtime timeout, set via setResponseTimeout() // master function that conducts Modbus transactions uint8_t ModbusMasterTransaction(uint8_t u8MBFunction); From 7df560f14480ae1b86769733b44aa16b218ee1e6 Mon Sep 17 00:00:00 2001 From: Karoly Czovek Date: Wed, 11 Feb 2026 18:35:59 +0100 Subject: [PATCH 2/2] feat: Add setResponseTimeout() for configurable response timeout --- README.md | 2 ++ keywords.txt | 1 + src/ModbusMaster.cpp | 6 ++++++ src/ModbusMaster.h | 14 +++++++++----- 4 files changed, 18 insertions(+), 5 deletions(-) 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 9922b57..29d782e 100644 --- a/src/ModbusMaster.cpp +++ b/src/ModbusMaster.cpp @@ -74,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; diff --git a/src/ModbusMaster.h b/src/ModbusMaster.h index 953c45c..0d767dd 100644 --- a/src/ModbusMaster.h +++ b/src/ModbusMaster.h @@ -217,8 +217,13 @@ 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 2000). Use e.g. 500 for faster fail when no slave is present. */ - void setResponseTimeout(uint16_t ms) { _u16ResponseTimeoutMs = ms; } + /** + * 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 @@ -252,9 +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] (default) - uint16_t _u16ResponseTimeoutMs; ///< runtime timeout, set via setResponseTimeout() - + static const uint16_t ku16MBResponseTimeout = 2000; ///< default + uint16_t _u16ResponseTimeoutMs; ///< runtime timeout // master function that conducts Modbus transactions uint8_t ModbusMasterTransaction(uint8_t u8MBFunction);