#!/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}")