From 8084e7a5fc17c7816cc6b7ad9cf22fef45137891 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期二, 11 二月 2025 13:44:27 +0800
Subject: [PATCH] V3.3,修改gps串口接收为dma,加入新增充电4小时自动重启一次

---
 FML/GPS.c |   62 ++++++++++++++++++++++++------
 1 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/FML/GPS.c b/FML/GPS.c
index 8143d5c..bd68186 100644
--- a/FML/GPS.c
+++ b/FML/GPS.c
@@ -475,13 +475,53 @@
 extern uint8_t GPS_successful_flag;
 extern uint32_t uwbled,gpsled,loraled,powerled;
 extern uint8_t jinru_parsegga_flag;
-extern uint8_t UDPClient_UploadGPS_flag;
 extern uint8_t fangchai_flag;
 uint8_t GPS_ParseGGA_data[256];
 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;
@@ -489,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;
@@ -498,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)
@@ -509,11 +555,6 @@
         GPS_successful_flag=1;
         _pcData[_u32Len-1]=0;
         _pcData[_u32Len-2]=0;
-//        if(UDPClient_UploadGPS_flag)
-//        {
-//        UDPClient_UploadGPS(_pcData);
-//        UDPClient_UploadGPS_flag=0;    
-//        }        
 //        memcpy(GPS_data,_pcData, _u32Len-2);//去掉回车换行
     state_flag = 0;
     state_flag = fangchai_flag;
@@ -530,11 +571,6 @@
         GPS_successful_flag=0;
         _pcData[_u32Len-1]=0;
         _pcData[_u32Len-2]=0;
-//        if(UDPClient_UploadGPS_flag)
-//        {
-//        UDPClient_UploadGPS(_pcData);
-//        UDPClient_UploadGPS_flag=0;    
-//        }
 //        memcpy(GPS_data,_pcData, _u32Len-2);
             state_flag = 0;
     state_flag = fangchai_flag;
@@ -844,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