diff --git a/client.go b/client.go index 2f2969a..9262cc7 100644 --- a/client.go +++ b/client.go @@ -8,6 +8,7 @@ import ( "context" "encoding/binary" "fmt" + "time" ) // Logger is the interface to the required logging functions @@ -632,12 +633,24 @@ func (mb *client) send(ctx context.Context, request *ProtocolDataUnit) (response if err != nil { return } - aduResponse, err := mb.transporter.Send(ctx, 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(ctx, aduRequest) + if err != nil { + return + } + err = mb.packager.Verify(aduRequest, aduResponse) + if err == nil { + break + } + if time.Now().After(maxTime) { + err = fmt.Errorf("modbus: response timeout") + return + } + // Else try again until timeout. } response, err = mb.packager.Decode(aduResponse) if err != nil {