STC15W單片機解析GPS數據2

$GNGGA,093507.000,3145.615378,N,11955.720475,E,1,9,1.79,29.336,M,6.667,M,,*47
$GPGSA,A,3,19,17,09,193,28,05,,,,,,,2.00,1.79,0.89*3D
$GLGSA,A,3,72,65,86,,,,,,,,,,2.00,1.79,0.89*1A
$GPGSV,3,1,12,19,73,093,38,193,64,120,24,06,58,356,16,17,54,120,34*46
$GPGSV,3,2,12,50,52,166,36,02,42,305,20,09,36,094,36,05,27,227,19*76
$GPGSV,3,3,12,12,26,303,15,04,20,058,,28,11,177,29,25,05,322,*73
$GLGSV,2,1,08,72,70,095,30,87,46,353,,65,44,182,36,86,35,083,25*62
$GLGSV,2,2,08,71,29,035,,88,19,317,,77,12,250,,78,12,301,*61
$GNRMC,093507.000,A,3145.615378,N,11955.720475,E,0.00,353.79,240520,,,A*75
$GNVTG,353.79,T,,M,0.00,N,0.00,K,A*28

前一篇博客STC15W單片機解析GPS數據1存在一個缺陷,只能選取GPS串口發送數據的第一條語句,即只能選取$GNGGA語句,其它語句無法選取,主要是程序的缺陷.

修改後usart.c的程序:

/********************* UART2中斷函數************************/
void UART2_int (void) interrupt UART2_VECTOR
{
	
	if(RI2)
	{
		CLR_RI2();
		if(COM2.B_RX_OK == 0)
		{
			if(COM2.RX_Cnt >= COM_RX2_Lenth)	COM2.RX_Cnt = 0;
			temp=S2BUF;
			RX2_Buffer[COM2.RX_Cnt++] = temp;
                       //接收$GNGGA語句						
        //	if((RX2_Buffer[2]=='N')&&(RX2_Buffer[5]=='A'))
        //	{
        //		RcvStart=1;
        //	}

                       //選擇接收$GNVTG語句		
			if(RX2_Buffer[0]=='$')
			{
			//根據需求選取關心的語句,本例程關心$GNVTG語句
			if((RX2_Buffer[2]=='N')&&(RX2_Buffer[5]=='G'))
				{
					LED=0;
					RcvStart=1;
				}
			}
			if((RcvStart==1)&&(temp=='\n'))
			{
				RcvStart=0;
				S2CON &= ~(1<<4);	//禁止串口2接收
				RcvFlag=1;//接收完成$GNGGA字符串
				LED=1;
			}
                       if((RcvFlag==0)&&(temp=='\n'))
			{
		          COM2.RX_Cnt=0;
			}
			COM2.RX_TimeOut = TimeOutSet2;
		}
	}

	if(TI2)
	{
		CLR_TI2();
		if(COM2.TX_read != COM2.TX_write)
		{
		 	S2BUF = TX2_Buffer[COM2.TX_read];
			if(++COM2.TX_read >= COM_TX2_Lenth) COM2.TX_read = 0;
		}
		else	COM2.B_TX_busy = 0;
	}

}

 根據關心的語句 修改程序中的RX2_Buffer的下標  if((RX2_Buffer[2]=='N')&&(RX2_Buffer[5]=='G'))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章