fix: 支持拼接多包解析 + 校验失败标记 state=3

- dg430.py: 新增 split_packets() 按 STX+LEN 拆分拼接的 DG430 数据包
- handlers.py: parse_loop 拆分后只解析 B2 状态上报包,非 B2 跳过
- models.py: mark_parsed 改为 mark_record_state(state) 支持自定义状态
- 校验失败 → state=3; 解析成功 → state=1
This commit is contained in:
wangfq
2026-05-27 16:39:39 +08:00
parent 8c5389670d
commit 97302caf6b
3 changed files with 125 additions and 40 deletions

View File

@@ -86,6 +86,41 @@ def hex_str_to_bytes(hex_str: str) -> bytes:
return bytes.fromhex(hex_str)
def split_packets(data: bytes) -> list[bytes]:
"""从拼接的字节流中拆分出各个 DG430 数据包
每条记录可能包含多条串口指令拼在一起,如:
B1 复位回复 + B2 状态上报 + ...
根据 STX + LEN 字段确定包边界,逐个拆分。
Returns:
独立的数据包列表,每个元素为一个完整包 (含 STX .. SUM)
"""
packets = []
i = 0
while i < len(data):
# 找 STX
stx_pos = data.find(STX, i)
if stx_pos < 0:
break
# 需要至少读到 LEN 字段 (STX + ADDR + LEN = 3 bytes)
if stx_pos + 3 > len(data):
break
pkt_len = 5 + data[stx_pos + 2] # STX + ADDR + LEN + DATA(LEN) + XOR + SUM
end = stx_pos + pkt_len
if end > len(data):
logger.warning(f"数据包不完整: stx_pos={stx_pos}, pkt_len={pkt_len}, data_len={len(data)}")
break
packets.append(data[stx_pos:end])
i = end
return packets
# ─── 解析指令 ───────────────────────────────────────────────────────
def parse_b2_status(data: bytes) -> DG430Status | None: