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