From 34b8d0fedd50960c2890e1841b8cf2916f9c513e Mon Sep 17 00:00:00 2001 From: Fuyao Date: Wed, 26 Nov 2025 15:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E6=A0=87=E5=AE=9A=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=86=99=E5=85=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtu_transport.go | 52 +++++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/rtu_transport.go b/rtu_transport.go index b23a912..769b3ef 100644 --- a/rtu_transport.go +++ b/rtu_transport.go @@ -332,8 +332,8 @@ func (rt *rtuTransport) readRTUFrame() (res *pdu, err error) { crc.add(rxbuf[0:crcEndIndex]) // 校验范围从 rxbuf[0] 到数据域结束 // 比较接收到的 CRC - // sentHigh := rxbuf[crcEndIndex] // C_high (例如 0x8B) - // sentLow := rxbuf[crcEndIndex+1] // C_low (例如 0xB0) + sentHigh := rxbuf[crcEndIndex] // C_high (例如 0x8B) + sentLow := rxbuf[crcEndIndex+1] // C_low (例如 0xB0) // 由于 isEqual 期望 (low, high),我们需要将 sentLow 传给 low @@ -344,11 +344,11 @@ func (rt *rtuTransport) readRTUFrame() (res *pdu, err error) { // fmt.Println("len: ", len(rxbuf[crcEndIndex-10:crcEndIndex])) - // if !crc.isEqual(sentLow, sentHigh) { - // err = ErrBadCRC - // fmt.Println("crc: ", sentLow, sentHigh, "byte needed: ", bytesNeeded) - // return - // } + if !crc.isEqual(sentHigh, sentLow) { + err = ErrBadCRC + // fmt.Println("crc: ", sentLow, sentHigh, "byte needed: ", bytesNeeded) + return + } // 8. 构造 PDU // Payload 包含:自定义数据 (4 bytes) + Data (N bytes) @@ -470,17 +470,11 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { return } - // fmt.Println("---: ", rxbuf[:10]) - - // a := make([]byte, 100) - // n, err := io.ReadFull(rt.link, a) - // fmt.Println("n: ", n, "err: ", err, "a: ", a) - time.Sleep(1 * time.Second) - // 使用临时缓冲区循环读取自定义数据 tempBuf := make([]byte, 256) // 每次读取最多256字节 totalRead := 0 startPos := 3 + bytesNeeded + var lastErr error // 记录最后一次非超时错误 for { // 检查缓冲区是否还有空间 @@ -499,31 +493,23 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { totalRead += n } - // 如果遇到超时错误,说明没有更多数据了 + // 如果遇到超时错误,说明超时时间到了,退出循环 if readErr != nil { if os.IsTimeout(readErr) { - // 超时是正常的,说明自定义数据读取完成 + // 超时时间到,退出循环 + // 如果有之前记录的错误,使用它;否则使用超时错误 + if lastErr != nil { + err = lastErr + } break } - // 其他错误需要检查是否是EOF(数据读取完成) - if readErr == io.EOF { - break - } - // 对于其他错误,如果已经读取了一些数据,继续处理 - if totalRead == 0 { - err = readErr - return - } - break + // 记录非超时错误,但继续等待直到超时 + lastErr = readErr + // 继续循环,等待超时 } - // 如果读取的字节数少于请求的,说明没有更多数据了 - if n < len(tempBuf) { - break - } } - // 返回标准响应的payload(地址+值,4字节)+ 自定义数据 // 标准响应的payload在 rxbuf[2:3+bytesNeeded-2] 位置 standardPayloadStart := 2 standardPayloadEnd := 3 + bytesNeeded - 2 @@ -538,9 +524,7 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) { res = &pdu{ unitId: rxbuf[0], functionCode: rxbuf[1], - // payload包含标准响应的payload + 自定义数据 - payload: completePayload, - // payload: a, + payload: completePayload, } return