#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 分析STM32输出的原始十六进制数据 """ import struct # 原始数据 raw_hex = """ 41 E7 00 2F 06 AF 0E 0D 0A AA 55 01 2C 00 68 70 21 B0 6E EA 43 40 E9 11 40 BD DB 11 5D 40 7F C3 65 43 F4 FD 54 BC 58 39 34 BC A6 9B 44 BB 77 3E A5 42 EC 4C 9E 00 01 1B 00 00 6A 14 0D 0A AA 55 02 20 00 58 39 34 BC BA 49 8C BE 4E 62 80 BF 7F 6A BC 3D D1 22 5B BE 00 00 00 80 00 00 F0 41 F1 00 2F 06 A3 0D 0D 0A """ def parse_frames(hex_string): """解析帧数据""" # 移除空格和换行,转换为字节 hex_clean = hex_string.replace(' ', '').replace('\n', '') data = bytes.fromhex(hex_clean) print(f"总数据长度: {len(data)} 字节\n") i = 0 frame_count = 0 while i < len(data) - 2: # 查找帧头 AA 55 if data[i] == 0xAA and data[i+1] == 0x55: frame_count += 1 print(f"{'='*60}") print(f"帧 #{frame_count} - 位置: {i} (0x{i:04X})") print(f"{'='*60}") if i + 5 > len(data): print("数据不足,无法解析帧头") break # 解析帧头 frame_type = data[i+2] data_len = struct.unpack(' len(data): print(f"错误: 帧不完整,需要{total_frame_len}字节,剩余{len(data)-i}字节") print(f"原始数据: {data[i:min(i+20, len(data))].hex(' ').upper()}") i += 1 continue # 提取完整帧 frame = data[i:i+total_frame_len] payload = frame[5:5+data_len] checksum = struct.unpack('