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:
35
src/dg430.py
35
src/dg430.py
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user