yincheng.zhong
3 天以前 30303d366d1a0d857357c90bed876686f2d1e603
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/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}")