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 |   94 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 82 insertions(+), 12 deletions(-)

diff --git a/FML/GPS.c b/FML/GPS.c
index aa6ae4f..bd68186 100644
--- a/FML/GPS.c
+++ b/FML/GPS.c
@@ -474,12 +474,62 @@
 extern uint8_t GPS_data[100];
 extern uint8_t GPS_successful_flag;
 extern uint32_t uwbled,gpsled,loraled,powerled;
+extern uint8_t jinru_parsegga_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;
     ST_GPS stGPS;
     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;
@@ -489,27 +539,46 @@
     {
         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)
         {
             l_fnGPSEventCallback(GPS_TYPE_GGA, _pcData, _u32Len);
         }
-        gpsled=BLUE;
+        gpsled=RED;
         GPS_successful_flag=1;
-        GPS_data[_u32Len-1]=0;
-        GPS_data[_u32Len-2]=0;
-        memcpy(GPS_data,_pcData, _u32Len-2);//去掉回车换行
+        _pcData[_u32Len-1]=0;
+        _pcData[_u32Len-2]=0;
+//        memcpy(GPS_data,_pcData, _u32Len-2);//去掉回车换行
+    state_flag = 0;
+    state_flag = fangchai_flag;
+        
+        HIDO_UINT32 u32Len = HIDO_UtilSnprintf((HIDO_CHAR *)GPS_ParseGGA_data, sizeof(GPS_ParseGGA_data), "%s,%X,%02x,%x,%d,%d,%d,%d\r\n",
+                _pcData, g_com_map[2], bat_percent,0,0,0,state_flag,gpsbaoxu);
+        gpsbaoxu++;
+        GPS_ParseGGA_changdu=u32Len;
+
     }
     else
     {
-        gpsled=RED;
+        gpsled=LEDOFF;
         GPS_successful_flag=0;
-        GPS_data[_u32Len-1]=0;
-        GPS_data[_u32Len-2]=0;
-        memcpy(GPS_data,_pcData, _u32Len-2);
+        _pcData[_u32Len-1]=0;
+        _pcData[_u32Len-2]=0;
+//        memcpy(GPS_data,_pcData, _u32Len-2);
+            state_flag = 0;
+    state_flag = fangchai_flag;
+        
+        HIDO_UINT32 u32Len = HIDO_UtilSnprintf((HIDO_CHAR *)GPS_ParseGGA_data, sizeof(GPS_ParseGGA_data), "%s,%X,%02x,%x,%d,%d,%d,%d\r\n",
+                _pcData, g_com_map[2], bat_percent,0,0,0,state_flag,gpsbaoxu);
+        gpsbaoxu++;
+        GPS_ParseGGA_changdu=u32Len;
     }
 
     return HIDO_OK;
@@ -658,6 +727,7 @@
             	if(strstr(l_stGPSRecv.m_acRecvBuf, "GGA,") != HIDO_NULL)
             	{
             		GPS_ParseGGA(l_stGPSRecv.m_acRecvBuf, l_stGPSRecv.m_u32RecvLen);
+                    memset(l_stGPSRecv.m_acRecvBuf,0, l_stGPSRecv.m_u32RecvLen);
             	}
                 else if(strstr(l_stGPSRecv.m_acRecvBuf, "RMC,") != HIDO_NULL)
             	{
@@ -810,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