# Python-STM32 通信协议规范 ## 协议概述 本协议用于STM32H7割草机MCU与Python控制程序之间的双向通信。 **传输介质:** UART5, 921600 bps, 8N1 **传输方式:** DMA发送和接收 **校验方式:** 16位累加和 (Checksum_u16) --- ## 通用帧格式 所有数据包采用统一帧格式: ``` ┌──────┬──────┬──────┬────────┬─────────┬──────────┬──────┬──────┐ │ AA │ 55 │ TYPE │ LEN(L) │ LEN(H) │ PAYLOAD │ CRC │ 0D0A │ ├──────┼──────┼──────┼────────┼─────────┼──────────┼──────┼──────┤ │ 帧头1 │ 帧头2 │ 类型 │ 长度低 │ 长度高 │ 数据负载 │ 校验 │ 帧尾 │ │ 1B │ 1B │ 1B │ 1B │ 1B │ N Bytes │ 2B │ 2B │ └──────┴──────┴──────┴────────┴─────────┴──────────┴──────┴──────┘ ``` **字段说明:** - **帧头 (2B):** 固定为 `0xAA 0x55` - **类型 (1B):** 数据包类型标识 - `0x01` - GPS数据 (STM32→Python) - `0x02` - IMU数据 (STM32→Python) - `0x10` - 控制命令 (Python→STM32) - **长度 (2B):** PAYLOAD字段的字节数 (小端序) - **PAYLOAD (NB):** 实际数据内容,结构体packed,小端序 - **校验和 (2B):** 从帧头到PAYLOAD结尾的16位累加和 (小端序) - **帧尾 (2B):** 固定为 `0x0D 0x0A` (CR LF) **校验和计算:** ```python checksum = sum(frame_bytes) & 0xFFFF # 16位累加和 ``` --- ## 数据包类型定义 ### 1. GPS数据包 (Type=0x01) **方向:** STM32 → Python **频率:** 10 Hz **负载长度:** 44 字节 **C结构体定义:** ```c typedef struct __attribute__((packed)) { double m_dLatitude; // 纬度(°), 正数为北纬 (8B) double m_dLongitude; // 经度(°), 正数为东经 (8B) float m_fHeadingAngle; // 航向角(°), 0~360, 北为0顺时针 (4B) float m_fEastVelocity; // 东方向速度(m/s) (4B) float m_fNorthVelocity; // 北方向速度(m/s) (4B) float m_fUpVelocity; // 天顶方向速度(m/s) (4B) float m_fAltitude; // 高程(m) (4B) uint32_t m_u32UTCTime; // UTC时间, hhmmss格式 (例: 123045) (4B) uint8_t m_u8PositionQuality; // 定位质量: 0=无效,1=单点,2=差分,4=固定,5=浮点 (1B) uint8_t m_u8SatelliteCount; // 卫星数量 (1B) uint8_t m_u8Reserved[2]; // 保留字节(对齐到4字节边界) (2B) } ST_PythonLink_GPS; // 总计44字节 ``` **Python解析结构:** ```python GPS_STRUCT_FMT = '