stm32_ota/ABM开发板(APP源码)/FreeRTOS版本/APPV4.0/HARDWARE/LTE/EC20/ec20gnss.c

237 lines
10 KiB
C
Raw Permalink Normal View History

2024-12-17 20:03:43 +08:00
#include "ec20gnss.h"
#include <stdlib.h>
#include "syslib.h"
/********************************************************************************
* @file ec20gnss.c
* @author <EFBFBD>̳ϿƼ<EFBFBD> Mr.Wang
* @version V1.0.0
* @date 9-Jan-2021
* @brief Quectelģ<EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD> GNSSȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************
* @attention
* EC20ģ<EFBFBD><EFBFBD>֧<EFBFBD>ֶλϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>GPS<EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD>ж<EFBFBD>λ
*******************************************************************************/
/*****************************************
*ec20 GNSS <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
****************************************/
#define GNSS_CMDPACK_LEN 128 //EC20 GNSS<53><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>
NMEARMC_s sRMCData ; //NMEARMC_s<5F><EFBFBD><E1B9B9>ȫ<EFBFBD><C8AB> <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>NMEA<45><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/********************************************************
ec20ģ<EFBFBD><EFBFBD> GNSS <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD>
*********************************************************/
enum eGnssCmdNum
{
OPENNMEA =0, SELFOPENGNSS = 1, OPENGNSS =2, QUERYRMC =3 , CLOSEGNSS =4
} ; //ö<><C3B6>ec20ģ<30><C4A3>GNSS<53><53><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
volatile EC20_CMD_DATA_s sGnssCmd[11]=
{
// cmdNum cmdStr, timeout(100ms), trueStr, trueOffset falseStr revResult rtyNum
{OPENNMEA, "AT+QGPSCFG=\"nmeasrc\",1\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> AT+QGPSGNMEA <20><>ȡ NMEA <20><><EFBFBD><EFBFBD>
{SELFOPENGNSS, "AT+QGPSCFG=\"autogps\",1\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>GNSS<53><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{OPENGNSS, "AT+QGPS=1\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>GNSS
{QUERYRMC, "AT+QGPSGNMEA=\"RMC\"\r\n", 3, "+QGPSGNMEA: $GPRMC" , -1, "ERROR", TIMEOUT, 2 }, //<2F><>ȡ NMEA <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>RMC
{CLOSEGNSS, "AT+QGPSEND\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 } //<2F>ر<EFBFBD>GNSS
} ; //EC20ģ<30><C4A3>NET<45><54><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>EC20_CMD_DATA_s<5F><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> static inline const char *GnssCmdNumToString(enum eGnssCmdNum result)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٳ<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> eGnssCmdNum<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ö<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊö<EFBFBD>ٵij<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
**************************************************************************************************/
static inline const char *GnssCmdNumToString(enum eGnssCmdNum result)
{
switch (result)
{
ENUM_CHIP_TYPE_CASE(OPENNMEA)
ENUM_CHIP_TYPE_CASE(SELFOPENGNSS)
ENUM_CHIP_TYPE_CASE(OPENGNSS)
ENUM_CHIP_TYPE_CASE(QUERYRMC)
ENUM_CHIP_TYPE_CASE(CLOSEGNSS)
}
ErrorLogPrintf("EC20 <20><>ЧeGnssCmdNum!") ;
return "<EFBFBD>޴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_SendGnssCmd( uint8_t cmdNum, char *format,... )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GNSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 cmdNum EC20_CMD_DATA_s<EFBFBD><EFBFBD>cmdNum<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param2 char *format,... <EFBFBD>ɱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_SendGnssCmd( uint8_t cmdNum, char *format,... )
{
uint8_t revTimes = 0 ;
RunResult status = TIMEOUT ;
uint8_t retryTimes = sGnssCmd[cmdNum].rtyNum ;
char *cmdPack = NULL ;
format = sGnssCmd[cmdNum].cmdStr ;
cmdPack = portMalloc(GNSS_CMDPACK_LEN*sizeof(uint8_t)) ;
va_list ap;
va_start (ap, format);
int outLen = vsnprintf(cmdPack, GNSS_CMDPACK_LEN, (const char*)format, ap); //vsprintf (temp, cmd, ap); //<2F><><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ܵ<EFBFBD>temp<6D><70>
if((outLen<=0)||( outLen > GNSS_CMDPACK_LEN)) //vsprintf (temp, cmd, ap); //<2F><><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ܵ<EFBFBD>temp<6D><70>
{
ErrorLogPrintf("%s,%d:cmdPack spillover<65><72>",__FILE__, __LINE__) ; //<2F><><EFBFBD><EFBFBD>NET_CMDPACK_LEN<45><4E>ֵ
status = RUNERR ;
goto netCmdOut ;
}
while(retryTimes--)
{
Ec20AtBufReset() ;
revTimes = 0 ;
//UARTx_Printf(EC20_UART, (uint8_t *)"%s", (uint8_t *)cmdPack);
UARTx_SendData(EC20_UART, cmdPack, outLen) ; //DMA<4D><41><EFBFBD><EFBFBD>
while( revTimes++ < sGnssCmd[cmdNum].timeout )
{
Wait_For_Nms(100);
sGnssCmd[cmdNum].trueOffset = kmp(ec20AtBuf, sGnssCmd[cmdNum].trueStr) ;
if( sGnssCmd[cmdNum].trueOffset >= 0)
{
status = RUNOK ;
goto netCmdOut ;
}
else if( kmp(ec20AtBuf, sGnssCmd[cmdNum].falseStr) >= 0)
{
status = RUNERR ;
goto netCmdOut ;
}
}
Wait_For_Nms( 1000 ) ;
}
netCmdOut:portFree(cmdPack) ;
va_end (ap);
DebugLogPrintf("%s %s", GnssCmdNumToString((enum eGnssCmdNum)cmdNum), RunResultToString(status) ) ;
return (status) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20GnssConfig(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20 GNSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> AT+QGPSGNMEA <EFBFBD><EFBFBD>ȡ NMEA <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20GnssConfig(void)
{
RunResult runResult = EC20_SendGnssCmd(OPENNMEA, NULL ) ;
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20SelfOpenGnss(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GNSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20SelfOpenGnss(void)
{
RunResult runResult = EC20_SendGnssCmd(SELFOPENGNSS, NULL ) ;
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20OpenGnss(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20 GNSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20OpenGnss(void)
{
RunResult runResult = EC20_SendGnssCmd(OPENGNSS, NULL ) ;
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20CloseGnss(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20 <EFBFBD>ر<EFBFBD>EC20 GNSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20CloseGnss(void)
{
RunResult runResult = EC20_SendGnssCmd(CLOSEGNSS, NULL ) ;
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20GnssQueryRMC(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȡ NMEA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>RMC
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20GnssQueryRMC(NMEARMC_s *psNmeaRMC )
{
RunResult runResult = EC20_SendGnssCmd(QUERYRMC, NULL ) ;
memset(psNmeaRMC, 0, sizeof(NMEARMC_s)) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NMEARMC_s<5F><73><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>
if( runResult == RUNOK )
{
strtok(&ec20AtBuf[sGnssCmd[QUERYRMC].trueOffset], ",") ;
strncpy(psNmeaRMC->utcTime, strtok(NULL, ","), sizeof(psNmeaRMC->utcTime) ) ; //<2F><><EFBFBD><EFBFBD>UTCʱ<43><CAB1>
strncpy((char*)&psNmeaRMC->eGnssStatus, strtok(NULL, ","), 1 ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λ״̬
if( psNmeaRMC->eGnssStatus == ALREADY ) //<2F>Ѿ<EFBFBD><D1BE><EFBFBD>λ<EFBFBD>ɹ<EFBFBD>
{
strncpy(psNmeaRMC->latitude, strtok(NULL, ","), sizeof(psNmeaRMC->latitude) ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λγ<CEBB><CEB3>ֵ
strncpy((char*)&psNmeaRMC->eLatitudeDirect, strtok(NULL, ","), 1 ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λγ<CEBB>ȷ<EFBFBD><C8B7><EFBFBD>
strncpy(psNmeaRMC->longitude, strtok(NULL, ","), sizeof(psNmeaRMC->longitude) ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ֵ
strncpy((char*)&psNmeaRMC->eLongitudeDirect, strtok(NULL, ","), 1 ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λ<EFBFBD><CEBB><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
strncpy(psNmeaRMC->speed, strtok(NULL, ","), sizeof(psNmeaRMC->speed) ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
strncpy(psNmeaRMC->angDirect, strtok(NULL, ","), sizeof(psNmeaRMC->angDirect) ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>
strncpy(psNmeaRMC->utcDate, strtok(NULL, ","), sizeof(psNmeaRMC->utcDate) ) ; //<2F><><EFBFBD><EFBFBD>GNSS<53><53>λUTC<54><43><EFBFBD><EFBFBD>
}
else //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD>У<EFBFBD><D0A3><EFBFBD>ʾGPS<50>ź<EFBFBD><C5BA><EFBFBD>
{
runResult = TIMEOUT ;
}
}
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void RMCUtcToBJT(Calendar_u *puSetRTC, NMEARMC_s *psRMCData )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>GNSS<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>RMC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>ʱ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊ Calendar_u<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 puSetRTC Calendar_u<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param2 psRMCData NMEARMC_s<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
**************************************************************************************************/
void RMCUtcToBJT(Calendar_u *puSetRTC, NMEARMC_s *psRMCData )
{
strncpy((char*)&puSetRTC->sCalendar.w_year[0], "20", 2 ) ;
strncpy((char*)&puSetRTC->sCalendar.w_year[2], &psRMCData->utcDate[4], 2 ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strncpy((char*)puSetRTC->sCalendar.w_month , &psRMCData->utcDate[2], 2 ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strncpy((char*)puSetRTC->sCalendar.w_date , &psRMCData->utcDate[0], 2 ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strncpy((char*)&puSetRTC->sCalendar.hour , &psRMCData->utcTime[0], 2 ) ; //<2F><><EFBFBD><EFBFBD>ʱ
int hour = atoi((const char*)puSetRTC->sCalendar.hour) +8 ;
puSetRTC->sCalendar.hour[0] = hour/10 + 0x30 ;
puSetRTC->sCalendar.hour[1] = hour%10 + 0x30 ;
strncpy((char*)&puSetRTC->sCalendar.min , &psRMCData->utcTime[2], 2 ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strncpy((char*)&puSetRTC->sCalendar.sec , &psRMCData->utcTime[4], 2 ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
puSetRTC->sCalendar.colon1 = puSetRTC->sCalendar.colon2 = '.' ;
puSetRTC->sCalendar.dash1 = puSetRTC->sCalendar.dash2 = '-' ;
puSetRTC->sCalendar.spacing = ' ' ;
}