WXK
2025-02-11 8084e7a5fc17c7816cc6b7ad9cf22fef45137891
FML/GPS.c
@@ -480,7 +480,48 @@
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;
@@ -488,6 +529,7 @@
    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;
@@ -497,7 +539,12 @@
    {
        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)
@@ -833,7 +880,7 @@
    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;