/** ****************************************************************************** * @file gps_driver.h * @brief GPS NMEA数据接收和解析驱动 * @author Your Name * @date 2026-02-07 ****************************************************************************** * @attention * * 本驱动用于通过USART3接收GPS模块的NMEA数据,主要解析GPGGA语句 * 提取时间、经纬度等信息 * ****************************************************************************** */ #ifndef __GPS_DRIVER_H #define __GPS_DRIVER_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usart.h" #include #include #include /* Exported types ------------------------------------------------------------*/ /** * @brief GPS定位状态 */ typedef enum { GPS_FIX_INVALID = 0, // 无效定位 GPS_FIX_GPS = 1, // GPS定位 GPS_FIX_DGPS = 2, // 差分GPS定位 GPS_FIX_PPS = 3, // PPS定位 GPS_FIX_RTK = 4, // RTK固定解 GPS_FIX_RTK_FLOAT = 5, // RTK浮点解 GPS_FIX_ESTIMATED = 6, // 估算 GPS_FIX_MANUAL = 7, // 手动输入 GPS_FIX_SIMULATION = 8 // 模拟模式 } GPS_FixStatus_t; /** * @brief GPS时间结构体 */ typedef struct { uint8_t hour; // 时 (UTC) uint8_t minute; // 分 uint8_t second; // 秒 uint16_t millisec; // 毫秒 } GPS_Time_t; /** * @brief GPS位置结构体 */ typedef struct { double latitude; // 纬度 (度) char lat_direction; // 纬度方向 ('N' or 'S') double longitude; // 经度 (度) char lon_direction; // 经度方向 ('E' or 'W') double altitude; // 海拔高度 (米) GPS_FixStatus_t fix_status; // 定位状态 uint8_t satellites; // 使用的卫星数量 float hdop; // 水平精度因子 } GPS_Position_t; /** * @brief GPS数据结构体 */ typedef struct { GPS_Time_t time; // GPS时间 GPS_Position_t position; // GPS位置 uint8_t data_valid; // 数据有效标志 (1=有效, 0=无效) uint32_t last_update_tick; // 最后更新时间戳 } GPS_Data_t; /* Exported constants --------------------------------------------------------*/ #define GPS_UART_HANDLE huart3 // GPS使用的UART句柄 #define GPS_RX_BUFFER_SIZE 512 // 接收缓冲区大小 #define GPS_NMEA_MAX_LENGTH 128 // NMEA语句最大长度 #define GPS_DATA_TIMEOUT_MS 2000 // 数据超时时间(ms) /* Exported macro ------------------------------------------------------------*/ /* Exported functions prototypes ---------------------------------------------*/ /** * @brief 初始化GPS驱动 * @retval HAL状态 */ HAL_StatusTypeDef GPS_Init(void); /** * @brief GPS数据接收处理(在主循环中调用) * @retval None */ void GPS_Process(void); /** * @brief 获取GPS数据 * @param gps_data: 指向GPS数据结构体的指针 * @retval 1=数据有效, 0=数据无效或超时 */ uint8_t GPS_GetData(GPS_Data_t *gps_data); /** * @brief 检查GPS数据是否有效 * @retval 1=有效, 0=无效 */ uint8_t GPS_IsDataValid(void); /** * @brief 获取GPS时间字符串 * @param buffer: 输出缓冲区 * @param size: 缓冲区大小 * @retval None */ void GPS_GetTimeString(char *buffer, uint16_t size); /** * @brief 获取GPS位置字符串 * @param buffer: 输出缓冲区 * @param size: 缓冲区大小 * @retval None */ void GPS_GetPositionString(char *buffer, uint16_t size); /** * @brief UART接收完成回调函数(在stm32f4xx_it.c中调用) * @param huart: UART句柄 * @retval None */ void GPS_UART_RxCpltCallback(UART_HandleTypeDef *huart); /** * @brief UART空闲中断回调函数(在stm32f4xx_it.c中调用) * @param huart: UART句柄 * @retval None */ void GPS_UART_IdleCallback(UART_HandleTypeDef *huart); #ifdef __cplusplus } #endif #endif /* __GPS_DRIVER_H */