# GPS GPRMI和GPIMU数据解析实现说明 ## 概述 本次实现为STM32H7割草机项目添加了GPRMI(GPS/INS组合定位)和GPIMU(IMU传感器)数据包的解析功能。 ## 修改文件 ### 1. GPS.h - 添加数据结构和函数声明 - **ST_GPRMI**: 存储GPRMI数据的结构体(23个字段) - UTC时间、周数、周内时间 - 纬度、经度、高程及其标准差 - 三轴速度及标准差 - 姿态角(俯仰、侧倾、翻滚)及标准差 - 基线距离、卫星数、定位质量 - **ST_GPIMU**: 存储GPIMU数据的结构体(9个字段) - UTC时间 - 三轴加速度(g) - 三轴角速度(°/s) - 传感器温度 - 异或校验和 - **新增函数**: - `GPS_GetGPRMI()`: 获取最新GPRMI数据 - `GPS_GetGPIMU()`: 获取最新GPIMU数据 ### 2. GPS.c - 实现解析逻辑 #### 添加的静态变量 ```c static ST_GPRMI l_stGPRMI; // 存储最新GPRMI数据 static ST_GPIMU l_stGPIMU; // 存储最新GPIMU数据 ``` #### 修改的结构体 ```c ST_GPSRecv - 增加了Header4和Header5以识别GPRMI和GPIMU - 接收缓冲区从128增加到256字节 ``` #### 新增解析函数 - **GPS_ParseGPRMI()**: 解析23个字段的GPRMI数据 - 使用`HIDO_UtilParseFormat()`按格式解析 - 进行数据校验(GPS_DataCheck) - 转换字符串为相应数值类型 - 设置有效标志 - **GPS_ParseGPIMU()**: 解析9个字段的GPIMU数据 - 解析8个数据字段 + 1个校验字段 - 计算并验证异或校验和(可选) - 设置有效标志 #### 修改的函数 - **GPS_RecvFsm()**: 状态机识别新增的$GPRMI和$GPIMU头 - **GPS_Init()**: 初始化Header4和Header5 ## 数据格式 ### GPRMI格式 ``` $GPRMI,<1>,<2>,<3>,<4>,<5>,...,<23>*<校验> ``` 关键字段: - 定位质量指示:0=无效, 1=单点, 2=差分, 4=固定, 5=浮点 - 三轴速度:东向、北向、天顶方向 - 姿态角:俯仰、侧倾、翻滚 ### GPIMU格式 ``` $GPIMU,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>* ``` 关键字段: - 三轴加速度(g) - 三轴角速度(°/s) - 传感器温度(℃) ## 使用方法 ### 1. 在应用层获取GPRMI数据 ```c ST_GPRMI stGPRMI; if (GPS_GetGPRMI(&stGPRMI) == HIDO_OK) { // 使用stGPRMI数据 double lat = stGPRMI.m_dLatitude; double lon = stGPRMI.m_dLongitude; float alt = stGPRMI.m_fAltitude; uint8_t quality = stGPRMI.m_u8PositionQuality; } ``` ### 2. 在应用层获取GPIMU数据 ```c ST_GPIMU stGPIMU; if (GPS_GetGPIMU(&stGPIMU) == HIDO_OK) { // 使用stGPIMU数据 float accelX = stGPIMU.m_fAccelX; float gyroZ = stGPIMU.m_fGyroZ; float temp = stGPIMU.m_fTemperature; } ``` ### 3. 定期轮询示例 ```c void app_task(void *pvParameters) { GPS_Init(); // ...其他初始化 while (1) { GPS_Poll(); // 自动接收并解析数据 // 定期读取解析结果 ST_GPRMI gprmi; if (GPS_GetGPRMI(&gprmi) == HIDO_OK) { // 处理定位数据 } // ...其他处理 } } ``` ## 工作流程 1. **数据接收**: GPS模块通过UART2发送数据 2. **状态机识别**: `GPS_RecvFsm()`识别$GPRMI或$GPIMU头 3. **数据缓存**: 接收完整句子(直到\r\n) 4. **格式解析**: 调用对应解析函数 5. **数据校验**: 验证校验和(GPRMI使用*号校验,GPIMU使用异或) 6. **存储更新**: 更新静态变量`l_stGPRMI`或`l_stGPIMU` 7. **应用读取**: 通过`GPS_GetGPRMI()`或`GPS_GetGPIMU()`获取最新数据 ## 注意事项 1. **线程安全**: 解析函数在GPS_Poll()中调用,通常在单一任务中,无需加锁 2. **数据有效性**: 使用`m_bValid`标志判断数据是否有效 3. **缓冲区大小**: 已将接收缓冲区扩大到256字节以容纳GPRMI的长数据包 4. **校验和**: GPIMU的异或校验目前已实现但未强制验证,可根据需要启用 5. **时间格式**: - GPRMI: UTC时间存储为`hhmmss.ss * 100`(整数) - GPIMU: UTC时间存储为`hhmmss.sss * 1000`(毫秒) ## 测试建议 1. 使用串口工具发送测试数据验证解析正确性 2. 检查定位质量字段确保RTK固定解(值为4) 3. 监测IMU数据频率和温度漂移 4. 验证姿态角数据与实际倾斜一致 ## 文件清单 - `GPS.h` - 数据结构和函数声明 - `GPS.c` - 解析实现 - `GPS_Usage_Example.c` - 使用示例和详细注释 ## 版本信息 - 创建日期: 2025年11月11日 - 作者: www.hido-studio.com - 基于项目: Lawnmower_STM32H7