void gps_parser(void) { if(NMEA_CMD_Start) { //解析到以$开始的 NMEA 语句, 进入NMEA 解析流程: if(NMEA_CMD_Parsered) { //CMD语句类型解析完毕, 根据类型条用解析函数 switch(NMEA_CMD) { case NMEA_GPGGA: ParserGPGGA(); break; case NMEA_GPGSA: ParserGPGSA(); break; case NMEA_GPGSV: ParserGPGSV(); break; case NMEA_GPRMC: ParserGPRMC(); break; default: //无法识别的格式, 复位 NMEA_CMD=NMEA_NULL; NMEA_CMD_Parsered=0; NMEA_CMD_Index=1; NMEA_CMD_Start=0; } } else { //需要解析CMD语句类型 switch(SBUF) { case ',': //第一个字段结束 if(NMEA_CMD_Buff[4]=='G'&&NMEA_CMD_Buff[5]=='A') NMEA_CMD=NMEA_GPGGA; if(NMEA_CMD_Buff[4]=='S'&&NMEA_CMD_Buff[5]=='A') NMEA_CMD=NMEA_GPGSA; if(NMEA_CMD_Buff[5]=='V') NMEA_CMD=NMEA_GPGSV; if(NMEA_CMD_Buff[5]=='C') NMEA_CMD=NMEA_GPRMC; //此处如果都不成立, 即语句不被识别, 则NMEA_CMD为NULL或其他, //则转为根据类型解析时会跳转到无法识别的格式, 而后复位 NMEA_CMD_Parsered=1; NMEA_CMD_Index=1; NMEA_DAT_Block=0; NMEA_DAT_BlockIndex=0; break; case '*': NMEA_CMD_Start=0; break; default: //处于第一个字段中, 继续接收 NMEA_CMD_Buff[NMEA_CMD_Index]=SBUF; NMEA_CMD_Index++; if(NMEA_CMD_Index>6) NMEA_CMD_Start=0; // CMD 超过6个字符, (数组越界, 导致死机) // 则判断不是正常的CMD语句, 则略过此句. } } } else { //未解析到$, 循环接收并判断 直到 $ if (SBUF=='$') { //接收到$, 下一个字符即为类型判断字符, 先进行相关变量初始化 NMEA_CMD_Buff[0]=SBUF; NMEA_CMD_Start=1; //下次调用则进入NMEA 解析流程: NMEA_CMD_Index=1; //从头存放GPS类型字符到变量 NMEA_CMD_Parsered=0; NMEA_CMD=NMEA_NULL; NMEA_DAT_Block=0; NMEA_DAT_BlockIndex=0; } } }
void GPS::gps_parser(void) { if(NMEA_CMD_Start) { if(NMEA_CMD_Parsered) { switch(NMEA_CMD) { case NMEA_GPGGA: ParserGPGGA(); break; case NMEA_GPGSA: ParserGPGSA(); break; case NMEA_GPGSV: ParserGPGSV(); break; case NMEA_GPRMC: ParserGPRMC(); break; default: NMEA_CMD=NMEA_NULL; NMEA_CMD_Parsered=0; NMEA_CMD_Index=1; NMEA_CMD_Start=0; } } else { switch(SBUF) { case ',': if(NMEA_CMD_Buff[4]=='G'&&NMEA_CMD_Buff[5]=='A') NMEA_CMD=NMEA_GPGGA; if(NMEA_CMD_Buff[4]=='S'&&NMEA_CMD_Buff[5]=='A') NMEA_CMD=NMEA_GPGSA; if(NMEA_CMD_Buff[5]=='V') NMEA_CMD=NMEA_GPGSV; if(NMEA_CMD_Buff[5]=='C') NMEA_CMD=NMEA_GPRMC; NMEA_CMD_Parsered=1; NMEA_CMD_Index=1; NMEA_DAT_Block=0; NMEA_DAT_BlockIndex=0; break; case '*': NMEA_CMD_Start=0; break; default: NMEA_CMD_Buff[NMEA_CMD_Index]=SBUF; NMEA_CMD_Index++; if(NMEA_CMD_Index>6) NMEA_CMD_Start=0; } } } else { if (SBUF=='$') { NMEA_CMD_Buff[0]=SBUF; NMEA_CMD_Start=1; NMEA_CMD_Index=1; NMEA_CMD_Parsered=0; NMEA_CMD=NMEA_NULL; NMEA_DAT_Block=0; NMEA_DAT_BlockIndex=0; } } }