Beispiel #1
0
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;
        }
    }
}