From d7cedc11df3a790c8b8830c89b0bd69088a0e51d Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期三, 21 五月 2025 09:43:54 +0800
Subject: [PATCH] 3.7,放开加速计接口,可以修改

---
 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