⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 GPS卫星定位模块的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "pin.h"
#include "public.h"
#include "uart.h"
#include "commrtos.h"
#include "app.h"
#include "ParaManage.h"


double GPStrans (INT32U gpsData)
{
	return ((float)(gpsData))*1.0/1000000;
}

INT32U GetDistance(double StartLat,double StartLong,double EndLat,double EndLong)
{
	double fPhimean,fdLambda,fdPhi,fAlpha,fRho,fNu,fR,fz,fTemp,Distance;//,Bearing;   
	double D2R  = 0.017453;
	double a  = 6378137.0;
	double e2  = 0.006739496742337;
	INT32U  tmp;
  
	fdLambda = (StartLong - EndLong) * D2R;
	fdPhi = (StartLat - EndLat) * D2R;
	fPhimean = ((StartLat + EndLat) / 2.0) * D2R;
	fTemp = 1 - e2 * (pow(sin(fPhimean),2));
	fRho = (a * (1 - e2)) / pow(fTemp, 1.5);
	fNu = a / (sqrt(1 - e2 * (sin(fPhimean) * sin(fPhimean))));
	fz = sqrt(pow(sin(fdPhi/2.0),2)+cos(EndLat*D2R)*cos(StartLat*D2R)*pow(sin(fdLambda/2.0),2)) ;
	fz = 2 * asin(fz);
	fAlpha = cos(EndLat * D2R) * sin(fdLambda) * 1 / sin(fz);
	fAlpha = asin(fAlpha);
	fR = (fRho * fNu) / ((fRho * pow(sin(fAlpha),2)) + (fNu * pow(cos(fAlpha),2)));
	Distance = (fz * fR);   
	tmp  = (INT32U) Distance;
	return tmp;
}

//字符转换成浮点型(经度和纬度)
void TransData (INT8U *StrData,INT8U Num)
{
	typedef union
	{
		INT32U l;
		INT8U  buf[4];
	} ULL;
	ULL ll;
	char buf[20];
	INT8U j,dotloc;
	INT32U L1;
	INT32U L2;
	INT32U L3;
	
    j=0;
	dotloc = 0;
	memset(buf,0,20);
	do
	{
		buf[j] = StrData[j];
		j++;
		if(StrData[j]=='.')
		{
			dotloc = j;
			break;
		}
		if(j>5) break;
	}while(StrData[j]!='.');
	
	L1 = atol(buf);			//3201
	L3 = (L1%100);			//*100000/6; 分
	L1 = (L1/100)*1000000;	// 度*1000000
	
	memset(buf,0,20);
	j = 0;
	do
	{
		buf[j] = StrData[dotloc+1+j];
		j++;
		if(j>5) break;
	}while(StrData[j] != 0);
	L2 = atol(buf);//83115
	L2 = (L3*1000000 + L2*10);//83115*(1/100000)*1000000/(10)
	L2 = L2/60;		
	ll.l = L1+L2;

	if (ll.l != 0)          //数据转化错误为零时,不更新GPS数据
	{
		if (Num == 10)
		{
			TzGpsData.Lanti[3] = ll.buf[0];
			TzGpsData.Lanti[2] = ll.buf[1];
			TzGpsData.Lanti[1] = ll.buf[2];
			TzGpsData.Lanti[0] = ll.buf[3];
			GPSlatNEW = ll.l;
		}
		else if (Num == 11)
		{
			TzGpsData.Longi[3] = ll.buf[0];
			TzGpsData.Longi[2] = ll.buf[1];
			TzGpsData.Longi[1] = ll.buf[2];
			TzGpsData.Longi[0] = ll.buf[3];
			GPSlonNEW = ll.l;
		}
	}
}

//分析GPRMC数据
//输入    GPSData        GPS数据包
//返回    0--失败
//        1--成功
INT8U anlyGPS (INT8U *GPSData)
{
	float   f;
	INT8U   tmp;
	INT16U  i,j;
	INT8U   *Pi;
	INT8U   *PPi;
	INT8U   buf[20];
//	INT8U GPSData[]="GPRMC,080515.000,V,3201.8318,N,11849.5894,E,12.34,56.78,081106,,N*19";
				  //$GPRMC,024530.00 ,V,         , ,          , ,     ,     ,271206,,,N*7D
    			//	$GPRMC,024535.00 ,V,         , ,          , ,     ,     ,271206,,,N*78
    i=0;
    j=0;
    do
    {
    	if (j++ > 20)
    	{
    		GPSposFlg++ ;
    		TzGpsDataB.State.GpsState = 0;
			TestSendStr("f");
    		return FALSE;
    	}
    }while (GPSData[i++] != ',');
    
	if (GPSData[i] != ',')
	{
		memcpy ((char *)&buf[0],(char *)(&GPSData[i]),6);
		for (j=0; j<6; j++)
		{
			if ((buf[j] < 0x30) || (buf[j] > 0x39))
			{
				GPSposFlg++;
				TzGpsDataB.State.GpsState = 0;
				TestSendStr("e");
				return FALSE;
			}
		}
		memcpy ((char *)(&GPSRecData.GPSTime[0]),(char *)(&GPSData[i]),6);         //拷贝GPS时间
	}
	else
	{
		GPSposFlg++;
//		TestSendStr("!");
		TzGpsDataB.State.GpsState = 0;
		return FALSE;
	}
		
	j=0;
    do
    {
    	if (j++ > 20)
    	{
    		GPSposFlg++;
    		TzGpsDataB.State.GpsState = 0;
    		return FALSE;
    	}
    }while (GPSData[i++] != ',');
	
	if (GPSData[i] != ',')
	{
		if (GPSData[i] == 'A')
		{
			GPSposFlg = 0;
			TzGpsDataB.State.GpsState = 1;
			SetPin(GPSVALID);
		}
		else if (GPSData[i] == 'V')
		{
			GPSposFlg++;
//			TzGpsDataB.State.GpsState = 0;
//			ClrPin(GPSVALID);
		}
		else
    	{
    		GPSposFlg++;
    		TzGpsDataB.State.GpsState = 0;
    		return FALSE;
    	}
	}
	else
	{
		GPSposFlg++;
		TzGpsDataB.State.GpsState = 0;
		return FALSE;
	}
	
	j=0;
    do
    {
    	if (j++ > 20)
    		return FALSE;
    }while (GPSData[i++] != ',');
    
	if (GPSData[i] != ',')
	{
//		if (TzGpsDataB.State.GpsState)
		if (0 == GPSposFlg)
		{
			memset (&GPSRecData.GPSLanti[0],0,11);
			memcpy ((char *)&buf[0],(char *)(&GPSData[i]),10);
			for (j=0; j<10; j++)
			{
				if ((buf[j] < 0x30) || (buf[j] > 0x39))
				{
					if (buf[j] != '.')
						return FALSE;
				}
			}
			memcpy ((char *)(&GPSRecData.GPSLanti[0]),(char *)(&GPSData[i]),10);		//GPS纬度
	    	TransData (&GPSRecData.GPSLanti[0],10);
	    }
	    
	    j = 0;
	    do{
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }
    else
    {
		j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }
    
    
    if (GPSData[i] != ',')
    {
    	if (GPSData[i] == 'N')
    	{
    		TzGpsDataB.State.Lan = 1;
    	}
    	else if (GPSData[i] == 'S')
    	{
    		TzGpsDataB.State.Lan = 0;
    	}
    	else
    		return FALSE;
	    j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');					//南北纬度
    }
    else
    {
		j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }
    
    if (GPSData[i] != ',')
    {
//		if (TzGpsDataB.State.GpsState)
		if (0 == GPSposFlg)
		{
			memset (&GPSRecData.GPSLongi[0],0,12);
			memcpy (&buf[0],&GPSData[i],11);	//经度
			for (j=0; j<10; j++)
			{
				if ((buf[j] < 0x30) || (buf[j] > 0x39))
				{
					if (buf[j] != '.')
						return FALSE;
				}
			}
			memcpy (&GPSRecData.GPSLongi[0],&GPSData[i],11);	//经度
			TransData (&GPSRecData.GPSLongi[0],11);
		}
	    j=0;
		do{
	    	if (j++ > 20)
	    		return FALSE;
		}while (GPSData[i++] != ',');
    }
    else
    {
		j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }
	
    if (GPSData[i] != ',')
    {
    	if (GPSData[i] == 'E')
    	{
    		TzGpsDataB.State.Lon = 1;
    	}
    	else if (GPSData[i] == 'W')
    	{
    		TzGpsDataB.State.Lon = 0;
    	}
    	else
    		return FALSE;
	    j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');						//东西经度
    }
    else
    {
		j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }
    
    
    if (GPSData[i] != ',')
    {
//		if (TzGpsDataB.State.GpsState)
		if (0 == GPSposFlg)
		{
			Pi  = &GPSData[i];
			PPi = &buf[0];
			j = 0;
			do{
				*PPi = *Pi++;
				if ((*PPi < 0x30) || (*PPi > 0x39))
				{
					if (*PPi != '.')
						return FALSE;
				}
				PPi++;
		    	if (j++ > 20)
		    		return FALSE;
			}while (*Pi != ',');							//速度
			*PPi = 0;
			f = atof((char *)&buf[0]);

	       	tmp = (INT8U)(f*1.852);   //1knot = 1.852km
	        
	        TzGpsData.Speed = tmp;
	        if (tmp > 200)
	        {
				TzGpsData.Speed = 0;
			}
			
			if(TzGpsData.Speed > Para.OverSpeed)
			{
				TzGpsDataB.State.ChaoSu = 1;
			}
			else
			{
				TzGpsDataB.State.ChaoSu = 0;
			}
		}
	    j=0;
		do{
	    	if (j++ > 20)
	    		return FALSE;
		}while (GPSData[i++] != ',');
    }
    else
    {
		j=0;
	    do
	    {
	    	if (j++ > 20)
	    		return FALSE;
	    }while (GPSData[i++] != ',');
    }

    if (GPSData[i] != ',')
    {
//		if (TzGpsDataB.State.GpsState)
		if (0 == GPSposFlg)
		{
			Pi  = &GPSData[i];
			PPi = &buf[0];

			j = 0;
			do{
				*PPi = *Pi++;
				if ((*PPi < 0x30) || (*PPi > 0x39))
				{
					if (*PPi != '.')
						return FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -