From eb5ceb3f226d6f2b0e6514f4b9c93970df8cc4ef Mon Sep 17 00:00:00 2001 From: decadenza Date: Thu, 2 Nov 2023 11:33:25 +0000 Subject: [PATCH 1/2] Wait for correct response id --- client.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/client.go b/client.go index 2535b72..1e70206 100644 --- a/client.go +++ b/client.go @@ -7,6 +7,7 @@ package modbus import ( "encoding/binary" "fmt" + "time" ) // logger is the interface to the required logging functions @@ -487,12 +488,24 @@ func (mb *client) send(request *ProtocolDataUnit) (response *ProtocolDataUnit, e if err != nil { return } - aduResponse, err := mb.transporter.Send(aduRequest) - if err != nil { - return - } - if err = mb.packager.Verify(aduRequest, aduResponse); err != nil { - return + + // Wait for correct response ID before throwing error. + var aduResponse []byte + maxTime := time.Now().Add(tcpTimeout) + for { + aduResponse, err = mb.transporter.Send(aduRequest) + if err != nil { + return + } + err = mb.packager.Verify(aduRequest, aduResponse) + + if err == nil { + break + } + if time.Now().After(maxTime) { + return + } + // Else try again until timeout. } response, err = mb.packager.Decode(aduResponse) if err != nil { From c44b32a3860bc201ed1f373ae3cde0bf17273c58 Mon Sep 17 00:00:00 2001 From: decadenza Date: Fri, 3 Nov 2023 12:23:50 +0000 Subject: [PATCH 2/2] Added error return value --- client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client.go b/client.go index 1e70206..8c4f7cd 100644 --- a/client.go +++ b/client.go @@ -503,6 +503,7 @@ func (mb *client) send(request *ProtocolDataUnit) (response *ProtocolDataUnit, e break } if time.Now().After(maxTime) { + err = fmt.Errorf("modbus: response timeout") return } // Else try again until timeout.