From 936f83f498976ac64276d2f9000189589a079d9a Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期二, 22 四月 2025 14:29:47 +0800 Subject: [PATCH] 3.6,加入静止标志位上传 --- FML/GPS.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 49 insertions(+), 2 deletions(-) diff --git a/FML/GPS.c b/FML/GPS.c index 1587545..bd68186 100644 --- a/FML/GPS.c +++ b/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; -- Gitblit v1.9.3