From bcd4cc6a8ddce7fe40512dab1304f71530121dd2 Mon Sep 17 00:00:00 2001 From: wangfq Date: Wed, 27 May 2026 10:25:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DG430=20=E5=8D=8F=E8=AE=AE=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=20off-by-one=EF=BC=8Cpayload=20=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dg430.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/dg430.py b/src/dg430.py index 401993a..f8d2c60 100644 --- a/src/dg430.py +++ b/src/dg430.py @@ -65,11 +65,11 @@ def verify_packet(data: bytes) -> bool: return False length = data[2] - expected_len = 1 + 1 + 1 + length + 1 + 1 # STX + ADDR + LEN + DATA + XOR + SUM + expected_len = 1 + 1 + 1 + length + 1 + 1 # STX + ADDR + LEN + DATA(LEN) + XOR + SUM if len(data) != expected_len: return False - payload_end = 4 + length # STX(1) + ADDR(1) + LEN(1) + CMD(1) + DATA(LEN-1) + payload_end = 3 + length # 校验范围 [ADDR .. DATA末尾] actual_xor = _xor_checksum(data, 1, payload_end) actual_sum = _sum_checksum(data, 1, payload_end) @@ -91,7 +91,7 @@ def hex_str_to_bytes(hex_str: str) -> bytes: def parse_b2_status(data: bytes) -> DG430Status | None: """解析 0xB2 状态上报包 - 格式: STX | ADDR | LEN(0x18=24) | 0xB2 | 20字节状态内容 | XOR | SUM + 格式: STX | ADDR | LEN | CMD | DATA(LEN-1 bytes) | XOR | SUM """ if not verify_packet(data): logger.warning("DG430 数据包校验失败") @@ -103,7 +103,10 @@ def parse_b2_status(data: bytes) -> DG430Status | None: logger.debug(f"非 B2 指令: 0x{cmd:02X}") return None - payload = data[4:24] # 20 字节状态内容 + payload = data[4:3 + data[2]] # DATA = LEN - 1 bytes (CMD 占位置 3) + if len(payload) < 20: + logger.warning(f"B2 数据长度不足: {len(payload)} < 20") + return None # 设备型号 dev_model = payload[0] # 1=PD132, 2=DLD110 @@ -125,9 +128,9 @@ def parse_b2_status(data: bytes) -> DG430Status | None: enter_dist = _le16(payload, 13) exit_dist = _le16(payload, 15) - # 速度 dm/s - enter_speed = _le16(payload, 17) - exit_speed = _le16(payload, 19) + # 速度 dm/s (V2.0.2 新增) + enter_speed = _le16(payload, 17) if len(payload) >= 19 else 0 + exit_speed = _le16(payload, 19) if len(payload) >= 21 else 0 return DG430Status( addr=addr,