#!/usr/bin/env python3
|
# 手动验证GPS帧的校验和计算
|
|
# 帧#1数据
|
frame_hex = "AA5501" + "2C00" + "AF92B0EB6EEA4340C5F7EE24DC115D40322452F1A7002435000000350000003CFA3EA4421436A100011B0000" + "4E14" + "0D0A"
|
|
frame_bytes = bytes.fromhex(frame_hex)
|
|
print(f"完整帧 ({len(frame_bytes)} 字节):")
|
print(' '.join(f'{b:02X}' for b in frame_bytes))
|
print()
|
|
# 分析结构
|
header = frame_bytes[0:2]
|
frame_type = frame_bytes[2]
|
payload_len = int.from_bytes(frame_bytes[3:5], 'little')
|
payload = frame_bytes[5:5+payload_len]
|
checksum_received = int.from_bytes(frame_bytes[5+payload_len:5+payload_len+2], 'little')
|
footer = frame_bytes[5+payload_len+2:5+payload_len+4]
|
|
print(f"帧头: {header.hex().upper()}")
|
print(f"类型: 0x{frame_type:02X}")
|
print(f"长度: {payload_len}")
|
print(f"校验和(接收): 0x{checksum_received:04X}")
|
print(f"帧尾: {footer.hex().upper()}")
|
print()
|
|
# 计算校验和 - Type + Length + Payload
|
checksum_data = frame_bytes[2:5+payload_len]
|
checksum_calc = sum(checksum_data) & 0xFFFF
|
|
print(f"校验和计算数据 ({len(checksum_data)} 字节):")
|
print(' '.join(f'{b:02X}' for b in checksum_data))
|
print()
|
print(f"计算结果: 0x{checksum_calc:04X}")
|
print(f"接收结果: 0x{checksum_received:04X}")
|
print(f"差值: {checksum_received - checksum_calc} (0x{(checksum_received - checksum_calc) & 0xFFFF:04X})")
|
print()
|
|
# 尝试逐字节分析
|
print("逐字节累加:")
|
cumsum = 0
|
for i, b in enumerate(checksum_data):
|
cumsum = (cumsum + b) & 0xFFFF
|
if i < 10 or i >= len(checksum_data) - 5:
|
print(f" [{i:2d}] 0x{b:02X} -> 累计: 0x{cumsum:04X}")
|
elif i == 10:
|
print(f" ... (省略中间部分)")
|
|
print()
|
print(f"最终累计: 0x{cumsum:04X}")
|
print(f"STM32发送: 0x{checksum_received:04X}")
|
|
# 分析可能的原因
|
if checksum_received > checksum_calc:
|
diff = checksum_received - checksum_calc
|
print(f"\n多算了 {diff} (0x{diff:04X})")
|
# 检查是否某些字节被重复计算
|
print(f"0xFF (帧头AA+55) = 0x{0xAA + 0x55:04X}")
|