From b45b8e1d8d888ab9dd214621aaa836336be6671d Mon Sep 17 00:00:00 2001 From: Fuyao Date: Wed, 26 Nov 2025 16:04:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E5=AE=9A=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E8=AF=BB=E5=8F=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtu_transport.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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 }