本次实现为STM32H7割草机项目添加了GPRMI(GPS/INS组合定位)和GPIMU(IMU传感器)数据包的解析功能。
ST_GPIMU: 存储GPIMU数据的结构体(9个字段)
新增函数:
GPS_GetGPRMI(): 获取最新GPRMI数据GPS_GetGPIMU(): 获取最新GPIMU数据static ST_GPRMI l_stGPRMI; // 存储最新GPRMI数据
static ST_GPIMU l_stGPIMU; // 存储最新GPIMU数据
ST_GPSRecv - 增加了Header4和Header5以识别GPRMI和GPIMU
- 接收缓冲区从128增加到256字节
HIDO_UtilParseFormat()按格式解析GPS_ParseGPIMU(): 解析9个字段的GPIMU数据
$GPRMI,<1>,<2>,<3>,<4>,<5>,...,<23>*<校验><CR><LF>
关键字段:
- 定位质量指示:0=无效, 1=单点, 2=差分, 4=固定, 5=浮点
- 三轴速度:东向、北向、天顶方向
- 姿态角:俯仰、侧倾、翻滚
$GPIMU,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>*<CR><LF>
关键字段:
- 三轴加速度(g)
- 三轴角速度(°/s)
- 传感器温度(℃)
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;
}
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;
}
void app_task(void *pvParameters)
{
GPS_Init();
// ...其他初始化
while (1)
{
GPS_Poll(); // 自动接收并解析数据
// 定期读取解析结果
ST_GPRMI gprmi;
if (GPS_GetGPRMI(&gprmi) == HIDO_OK) {
// 处理定位数据
}
// ...其他处理
}
}
GPS_RecvFsm()识别$GPRMI或$GPIMU头l_stGPRMI或l_stGPIMUGPS_GetGPRMI()或GPS_GetGPIMU()获取最新数据m_bValid标志判断数据是否有效hhmmss.ss * 100(整数)hhmmss.sss * 1000(毫秒)GPS.h - 数据结构和函数声明GPS.c - 解析实现GPS_Usage_Example.c - 使用示例和详细注释