| | |
| | | uint8_t GPS_ParseGGA_changdu; |
| | | extern uint16_t g_com_map[256]; |
| | | extern uint8_t bat_percent; |
| | | static HIDO_UINT8 l_u8PosState = 0; |
| | | uint8_t gpsbaoxu; |
| | | // 仅校验GNGGA数据是否有效(格式+校验和) |
| | | // 返回值:1=有效,0=无效 |
| | | uint16_t error1,error2,error3,error4; |
| | | uint8_t validate_gngga(const char *nmea_data) |
| | | { |
| | | // 基本格式检查 --------------------------------------------------- |
| | | // 检查起始符和最小长度 |
| | | if (nmea_data[0] != '$' || strlen(nmea_data) < 10) { |
| | | error1++; |
| | | return 0; |
| | | } |
| | | |
| | | // 检查是否为GNGGA语句 |
| | | if (strncmp(nmea_data+1, "GNGGA", 5) != 0) { |
| | | error2++; |
| | | return 0; |
| | | } |
| | | |
| | | // 校验和检查 ----------------------------------------------------- |
| | | const char *asterisk = strchr(nmea_data, '*'); |
| | | if (!asterisk || (asterisk - nmea_data) > 100) { |
| | | error3++; |
| | | return 0; // 找不到*号或位置异常 |
| | | } |
| | | |
| | | // 提取接收到的校验和(2位十六进制) |
| | | uint8_t received_checksum; |
| | | if (sscanf(asterisk+1, "%02hhx", &received_checksum) != 1) { |
| | | error4++; |
| | | return 0; // 校验和格式错误 |
| | | } |
| | | |
| | | // 计算校验和:从$后的第一个字符到*前的所有字符异或 |
| | | uint8_t calculated_checksum = 0; |
| | | for (const char *p = nmea_data+1; p < asterisk; p++) { |
| | | calculated_checksum ^= *p; |
| | | } |
| | | |
| | | return (calculated_checksum == received_checksum); |
| | | } |
| | | static HIDO_INT32 GPS_ParseGGA(HIDO_CHAR *_pcData, HIDO_UINT32 _u32Len) |
| | | { |
| | | uint16_t state_flag; |
| | |
| | | HIDO_DataStruct stPosState; |
| | | jinru_parsegga_flag=1; |
| | | memset(&stGPS, 0, sizeof(ST_GPS)); |
| | | memset(GPS_ParseGGA_data,0,GPS_ParseGGA_changdu); |
| | | if (GPS_DataCheck(_pcData, _u32Len) != HIDO_OK) |
| | | { |
| | | return HIDO_ERR; |
| | |
| | | { |
| | | return HIDO_ERR; |
| | | } |
| | | if(*(HIDO_CHAR *)stPosState.m_pData != '0') |
| | | // if (!validate_gngga((const char *)_pcData)) |
| | | // { |
| | | // return HIDO_ERR; |
| | | // } |
| | | l_u8PosState = atoi((HIDO_CHAR *)stPosState.m_pData); |
| | | if(l_u8PosState) |
| | | { |
| | | // HIDO_DebugString(_pcData, _u32Len); |
| | | if(l_fnGPSEventCallback != NULL) |
| | |
| | | |
| | | ST_UartInit stInit; |
| | | |
| | | stInit.m_eRxMode = UART_RX_MODE_INT; |
| | | stInit.m_eRxMode = UART_RX_MODE_DMA; |
| | | stInit.m_eTxMode = UART_TX_MODE_POLL; |
| | | stInit.m_pu8RxBuf = l_au8GPSUartRxBuf; |
| | | stInit.m_u32RxBufSize = GPS_UART_RX_BUF_SIZE; |