# IM23A 二进制协议说明 本文档记录 IM23A 模组输出的 `fmin`(导航)与 `fmim`(IMU)帧格式,便于固件与 Python 工具保持一致。 ## 帧固定结构 - 所有帧均以 ASCII 头 `f m i n` 或 `f m i m` 开始,以 `e d` 结尾。 - 校验和位于倒数第 4~3 字节,为 **前 N 字节(含帧头、负载)按字节求和** 的 `uint16_t` 小端值;导航帧 `N=96`,IMU 帧 `N=48`。 ## 导航帧(`fmin`,总长 100 字节) | 字段 | 类型 | 说明 | | --- | --- | --- | | 1 | double | UTC 时间 `hhmmss.ss` | | 2 | double | 纬度 (°) | | 3 | double | 经度 (°) | | 4 | double | 高程 (m) | | 5 | float | 北向速度 (m/s) | | 6 | float | 东向速度 (m/s) | | 7 | float | 向下速度 (m/s,固件转换为向上速度) | | 8 | float | 横滚角 (°) | | 9 | float | 俯仰角 (°) | | 10 | float | 航向角 (°) | | 11 | float | 定位精度 (m) | | 12~14 | float | 加速度计 XYZ 零偏 | | 15~17 | float | 陀螺仪 XYZ 零偏 | | 18 | float | 传感器温度 (°C) | | 19 | uint32_t | 状态字(低 8 位作为定位质量) | | 20 | uint16_t | 校验和 | | 21 | char | `e` | | 22 | char | `d` | ## IMU 帧(`fmim`,总长 52 字节) | 字段 | 类型 | 说明 | | --- | --- | --- | | 1 | double | UTC 时间 `hhmmss.ss`(转换为毫秒) | | 2~4 | float | 加速度计 XYZ (g) | | 5~7 | float | 陀螺仪 XYZ (°/s) | | 8~10 | float | 预留 | | 11 | uint16_t | 校验和 | | 12 | char | `e` | | 13 | char | `d` | ## 日志校验方法 可使用 Python 将十六进制日志解析为字节流,并按下述流程检测帧: ```python import struct, pathlib data = bytes(int(x, 16) for x in pathlib.Path("SaveWindows2025_11_27_17-46-32.TXT").read_text().split()) i, nav, imu = 0, 0, 0 while i <= len(data) - 4: head = data[i:i+4] length = 100 if head == b"fmin" else 52 if head == b"fmim" else None if length and data[i+length-2:i+length] == b"ed": payload = data[i:i+length] checksum = sum(payload[:-4]) & 0xFFFF if checksum == struct.unpack("