diff --git a/rtu_transport.go b/rtu_transport.go index 769b3ef..e799938 100644 --- a/rtu_transport.go +++ b/rtu_transport.go @@ -465,7 +465,8 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { // 标准modbus响应已读取完成,现在读取自定义数据 // 设置5秒超时来读取自定义数据 customDataTimeout := 5 * time.Second - err = rt.link.SetDeadline(time.Now().Add(customDataTimeout)) + deadline := time.Now().Add(customDataTimeout) + err = rt.link.SetDeadline(deadline) if err != nil { return } @@ -477,6 +478,16 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { var lastErr error // 记录最后一次非超时错误 for { + // 检查是否已经超时 + if time.Now().After(deadline) { + // 超时时间到,退出循环 + // 如果有之前记录的错误,使用它;否则err保持为nil(超时是正常的) + if lastErr != nil { + err = lastErr + } + break + } + // 检查缓冲区是否还有空间 if startPos+totalRead+len(tempBuf) > len(rxbuf) { // 如果缓冲区不够,扩展它 @@ -497,7 +508,7 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { if readErr != nil { if os.IsTimeout(readErr) { // 超时时间到,退出循环 - // 如果有之前记录的错误,使用它;否则使用超时错误 + // 如果有之前记录的错误,使用它;否则err保持为nil(超时是正常的) if lastErr != nil { err = lastErr }