//-------------------------------------------------------
//-------------------------------------------------------
//分析GPGSV信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,uint8_t *buf)
{
		uint8_t *p,*p1,dx;
		uint8_t len,i,j,slx=0;
		uint8_t posx;   	 
		p=buf;
		p1=(uint8_t*)strstr((const char *)p,"$GPGSV");   //strstr:搜索字符串$GPGSV在p中第一次出现的位置
		len=p1[7]-'0';								//得到GPGSV的条数(段数)
		posx=NMEA_Comma_Pos(p1,3); 					//得到可见卫星总数
		if(posx!=0XFF)gpsx->svnum_gps=NMEA_Str2num(p1+posx,&dx);
		for(i=0;i<len;i++)//一共有len段GPGSV数据
		{	 
				p1=(uint8_t*)strstr((const char *)p,"$GPGSV");  
				for(j=0;j<4;j++)
				{	  
						posx=NMEA_Comma_Pos(p1,4+j*4);
						if(posx!=0XFF)gpsx->slmsg_gps[slx].num=NMEA_Str2num(p1+posx,&dx);	//得到卫星编号
						else break; 
						posx=NMEA_Comma_Pos(p1,5+j*4);
						if(posx!=0XFF)gpsx->slmsg_gps[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//得到卫星仰角 
						else break;
						posx=NMEA_Comma_Pos(p1,6+j*4);
						if(posx!=0XFF)gpsx->slmsg_gps[slx].azideg=NMEA_Str2num(p1+posx,&dx);//得到卫星方位角
						else break; 
						posx=NMEA_Comma_Pos(p1,7+j*4);
						if(posx!=0XFF)gpsx->slmsg_gps[slx].sn=NMEA_Str2num(p1+posx,&dx);	//得到卫星信噪比
						else break;
						slx++;	   
				}   
				p=p1+1;//切换到下一个GPGSV信息
		}   
}
示例#2
0
//分析GPGSV信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,u8 *buf)
{
	u8 *p,*p1,dx;
	u8 len,i,j,slx=0;
	u8 posx;   	 
	p=buf;
	p1=(u8*)strstr((const char *)p,"$GPGSV");
	len=p1[7]-'0';								//得到GPGSV的条数
	posx=NMEA_Comma_Pos(p1,3); 					//得到可见卫星总数
	if(posx!=0XFF)gpsx->svnum=NMEA_Str2num(p1+posx,&dx);
	for(i=0;i<len;i++)
	{	 
		p1=(u8*)strstr((const char *)p,"$GPGSV");  
		for(j=0;j<4;j++)
		{	  
			posx=NMEA_Comma_Pos(p1,4+j*4);
			if(posx!=0XFF)gpsx->slmsg[slx].num=NMEA_Str2num(p1+posx,&dx);	//得到卫星编号
			else break; 
			posx=NMEA_Comma_Pos(p1,5+j*4);
			if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//得到卫星仰角 
			else break;
			posx=NMEA_Comma_Pos(p1,6+j*4);
			if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//得到卫星方位角
			else break; 
			posx=NMEA_Comma_Pos(p1,7+j*4);
			if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx);	//得到卫星信噪比
			else break;
			slx++;	   
		}   
 		p=p1+1;//切换到下一个GPGSV信息
	}   
}
//分析GNGGA信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GNGGA_Analysis(nmea_msg *gpsx,uint8_t *buf)
{
		uint8_t *p1,dx;			 
		uint8_t posx;    
		p1=(uint8_t*)strstr((const char *)buf,"$GNGGA");             //搜索字符串$GNGGA在p中第一次出现的位置
		posx=NMEA_Comma_Pos(p1,6);								//得到GPS状态
		if(posx!=0XFF)gpsx->gps_State=NMEA_Str2num(p1+posx,&dx);	
		posx=NMEA_Comma_Pos(p1,7);								//得到用于定位的卫星数
		if(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx); 
		posx=NMEA_Comma_Pos(p1,9);								//得到海拔高度
		if(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx);  
}
示例#4
0
//分析GPGGA信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPGGA_Analysis(nmea_msg *gpsx,u8 *buf)
{
	u8 *p1,dx;			 
	u8 posx;    
	p1=(u8*)strstr((const char *)buf,"$GPGGA");
	posx=NMEA_Comma_Pos(p1,6);								//得到GPS状态
	if(posx!=0XFF)gpsx->gpssta=NMEA_Str2num(p1+posx,&dx);	
	posx=NMEA_Comma_Pos(p1,7);								//得到用于定位的卫星数
	if(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx); 
	posx=NMEA_Comma_Pos(p1,9);								//得到海拔高度
	if(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx);  
}
//分析GNRMC信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GNRMC_Analysis(nmea_msg *gpsx, uint8_t *buf)
{
		uint8_t *p1,dx;			 
		uint8_t posx;     
		uint32_t temp;	   
		float rs;  
		p1=(uint8_t*)strstr((const char *)buf,"GNRMC");              //"$GNRMC",经常有&和GNRMC分开的情况,故只判断GNRMC.
		posx=NMEA_Comma_Pos(p1,1);								//得到UTC时间
		if(posx!=0XFF)
		{
				temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);	 	//得到UTC时间,去掉ms
				gpsx->utc.hour=temp/10000 + 8;                      // + 8:转换为北京时间
				gpsx->utc.min=(temp/100)%100;
				gpsx->utc.sec=temp%100;	 	 
		}	
		posx=NMEA_Comma_Pos(p1,3);								//得到纬度
		if(posx!=0XFF)
		{
				temp=NMEA_Str2num(p1+posx,&dx);		 	 
				gpsx->latitude=temp/NMEA_Pow(10,dx+2);	//得到°
				rs=temp%NMEA_Pow(10,dx+2);				//得到'		 
				gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为° 				
		}
		posx=NMEA_Comma_Pos(p1,4);								//南纬还是北纬 
		if(posx!=0XFF)gpsx->nshemi=*(p1+posx);					 
		posx=NMEA_Comma_Pos(p1,5);								//得到经度
		if(posx!=0XFF)
		{												  
				temp=NMEA_Str2num(p1+posx,&dx);		 	 
				gpsx->longitude=temp/NMEA_Pow(10,dx+2);	//得到°
				rs=temp%NMEA_Pow(10,dx+2);				//得到'		 
				gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为° 
		}
		posx=NMEA_Comma_Pos(p1,6);								//东经还是西经
		if(posx!=0XFF)gpsx->ewhemi=*(p1+posx);		 
		posx=NMEA_Comma_Pos(p1,9);								//得到UTC日期
		if(posx!=0XFF)
		{
				temp=NMEA_Str2num(p1+posx,&dx);		 				//得到UTC日期
				gpsx->utc.date=temp/10000;
				gpsx->utc.month=(temp/100)%100;
				gpsx->utc.year=2000+temp%100;	 	 
		} 
}
void NMEA_GNVTG_Analysis(nmea_msg *gpsx,uint8_t *buf)
{
		uint8_t *p1,dx;			 
		uint8_t posx;    
		p1=(uint8_t*)strstr((const char *)buf,"$GNVTG");				//搜索字符串$GNVTG在p中第一次出现的位置		 
		posx=NMEA_Comma_Pos(p1,7);								//得到地面速率
		if(posx!=0XFF)
		{
			gpsx->speed=NMEA_Str2num(p1+posx,&dx);
			if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx);	 	 		//确保扩大1000倍
		}
}  
示例#7
0
//分析GPVTG信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPVTG_Analysis(nmea_msg *gpsx,u8 *buf)
{
	u8 *p1,dx;			 
	u8 posx;    
	p1=(u8*)strstr((const char *)buf,"$GPVTG");							 
	posx=NMEA_Comma_Pos(p1,7);								//得到地面速率
	if(posx!=0XFF)
	{
		gpsx->speed=NMEA_Str2num(p1+posx,&dx);
		if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx);	 	 		//确保扩大1000倍
	}
}  
示例#8
0
//分析GPGSA信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPGSA_Analysis(nmea_msg *gpsx,u8 *buf)
{
	u8 *p1,dx;			 
	u8 posx; 
	u8 i;   
	p1=(u8*)strstr((const char *)buf,"$GPGSA");
	posx=NMEA_Comma_Pos(p1,2);								//得到定位类型
	if(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx);	
	for(i=0;i<12;i++)										//得到定位卫星编号
	{
		posx=NMEA_Comma_Pos(p1,3+i);					 
		if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx);
		else break; 
	}				  
	posx=NMEA_Comma_Pos(p1,15);								//得到PDOP位置精度因子
	if(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx);  
	posx=NMEA_Comma_Pos(p1,16);								//得到HDOP位置精度因子
	if(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx);  
	posx=NMEA_Comma_Pos(p1,17);								//得到VDOP位置精度因子
	if(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx);  
}
//分析GNGSA信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GNGSA_Analysis(nmea_msg *gpsx,uint8_t *buf)
{
		uint8_t *p,*p1,dx;			 
		uint8_t posx; 
		uint8_t i;
    
    p=buf;
		p1=(uint8_t*)strstr((const char *)p,"$GNGSA");             //搜索字符串$GNGSA在p中第一次出现的位置
		posx=NMEA_Comma_Pos(p1,2);							  //得到定位类型
		if(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx);
    
    //通常有2条GNGSA数据段
    for(i=0;i<12;i++)   //得到定位卫星编号(一条GNGSA语句最多包含12颗卫星)
    {
        posx=NMEA_Comma_Pos(p1,3+i);					 
        if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx);
        else break; 
    }
		p=p1+1;             //切换到下一个GNGSA信息
		p1=(uint8_t*)strstr((const char *)p,"$GNGSA");  
    for(i=0;i<12;i++)  //得到定位卫星编号(一条GNGSA语句最多包含12颗卫星)
    {
        posx=NMEA_Comma_Pos(p1,3+i);					 
        if(posx!=0XFF)gpsx->possl[i+12]=NMEA_Str2num(p1+posx,&dx);
        else break; 
    }
        
		posx=NMEA_Comma_Pos(p1,15);								//得到PDOP位置精度因子
		if(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx);  
		posx=NMEA_Comma_Pos(p1,16);								//得到HDOP位置精度因子
		if(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx);  
		posx=NMEA_Comma_Pos(p1,17);								//得到VDOP位置精度因子
		if(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx);  
}
void NMEA_GNVTG_Analysis(nmea_msg *gpsx, uint8_t *buf)
{
		uint8_t *p1,dx;			 
		uint8_t posx;    
		p1=(uint8_t*)strstr((const char *)buf,"$GNVTG");				//?????$GNVTG?p?????????		 
		posx=NMEA_Comma_Pos(p1,1);								
		if(posx!=0XFF)
		{
			gpsx->course_earth=NMEA_Str2num(p1+posx,&dx);       //???????????????(0-359?)(??100?)
		}
			posx=NMEA_Comma_Pos(p1,3);								
		if(posx!=0XFF)
		{
			gpsx->course_mag=NMEA_Str2num(p1+posx,&dx);         //???????????????(0-359?)(??100?)
		}
			posx=NMEA_Comma_Pos(p1,7);								//??????
		if(posx!=0XFF)
		{
			gpsx->speed=NMEA_Str2num(p1+posx,&dx);
			if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx);             //????1000?(1??/?? -> 0.001??/??)
			else if(dx>3)gpsx->speed/=NMEA_Pow(10,dx-3);        //????1000?(1??/?? -> 0.001??/??)(??1000?)
		}
}