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

📄 gps.c

📁 基于STC51通过GPS自主定位导航FAT文件系统程序
💻 C
字号:
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GPS数据包处理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*文件名称:GPS.c

//*文件作用:GPS数据包处理

//*文件作者:翟  鹏

//*创建日期:2004年5月
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&



#include <include.h>



//缓冲区定义
static uchar xdata gps_receive_buffer[GPS_RECEIVE_BUF_SIZE];//接收缓冲区
static uint  xdata gps_buf_point=0;//接收缓冲区指针
static float xdata gps_longitude=117.238144;//经度
static float xdata gps_latitude=39.117604;//纬度
static float xdata temp_longitude=117.238144;//经度
static float xdata temp_latitude=39.117604;//纬度
static uint  xdata gps_velocity=0;//速度
static uint  xdata gps_direction=0;//方向
static uchar xdata gps_date_str[]="010101";//日期
static uchar xdata gps_time_str[]="160000.00";//时间


//状态位
static uchar xdata gps_reset=1;//需要复位
static uchar xdata gps_ant_state=0;//GPS天线检测
static float xdata gps_trueness=99;//可信度
static uchar xdata gps_satellite=0;//卫星数量
static uchar xdata gps_3D=0;//3D
static uchar xdata gps_not_active=0;//不定位的时间



//*******************************************************************************************
//函数作用:GPS坐标转化为度
//参数说明:
//注意事项:
//返回说明:无
//*******************************************************************************************
static float GPSx_to_DUx(char *GPRMC)
{
	uint i;

	i=atoi(GPRMC);
	i/=100;
	return (float)i+atof(GPRMC+3)/60;
}
static float GPSy_to_DUy(char *GPRMC)
{
	uint i;

	i=atoi(GPRMC);
	i/=100;
	return (float)i+atof(GPRMC+2)/60;
}

//***********************************************************************************************************************
//函数作用:接收串口消息
//参数说明:
//注意事项:
//返回说明:如果接受到了完整包 返回1
//***********************************************************************************************************************
static uchar gps_get_msg(void)
{	
	uchar temp;
	
	//接收直到没有数据
	while(GPS_RECEIVE_CHAR(&temp))
	{
		DEBUG_SEND_CHAR(temp);

		if(temp=='$')
		{
			gps_buf_point=0;//清缓冲区指针
		}
		else if(temp=='\r')//判断结束符号
		{
			if(gps_buf_point)
			{
				gps_receive_buffer[gps_buf_point]=0;//添加结束符
				gps_buf_point=0;//清缓冲区指针
				return 1;
			}
		}
		else if(temp=='\n')//过滤
		{

		}
		else			//其他字符送入缓冲区
		{
			gps_receive_buffer[gps_buf_point++]=temp;//向缓存送数据
			if(gps_buf_point>=GPS_RECEIVE_BUF_SIZE-1)gps_buf_point=0;//判断是否超长
		}
	}
	return 0;
}


	
//***********************************************************************************************************************
//函数作用:处理GPS数据
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
static void gps_analyse(void)
{
	uchar *gps_argv[GPS_ARGV_NUM];//参数指针
	uchar gps_argv_length[GPS_ARGV_NUM];//参数长度
	uchar gps_argc;//参数个数
	uchar i;
	uchar length;
	
	
	//接收消息
	if(!gps_get_msg())return;

	//分析参数
	i=0;
	gps_argc=0;
	length=0;
	while(gps_receive_buffer[i])
	{
		if(gps_receive_buffer[i]==',')
		{
			gps_receive_buffer[i]=0;
			if(gps_argc)gps_argv_length[gps_argc-1]=length;
			length=0;
			gps_argv[gps_argc++]=&gps_receive_buffer[i+1];
			if(gps_argc>=GPS_ARGV_NUM)break;
		}
		else
		{
			length++;
		}
		i++;
	}


	//GPS可信度---GPGSA,A,3,01,05,07,30,14,31,,,,,,,6.99,4.33,5.49*0F
	if(strcmp(GPS_MSG_GSA,gps_receive_buffer)==0)
	{	
		//判断参数
		if(gps_argc!=17)return;
		
		gps_reset=0;
		
		//3D标志
		gps_3D=atoi(gps_argv[1]);
		
		//长时间不定位重新启动
		if(gps_3D<2)
		{
			gps_not_active++;
			if(gps_not_active>=88)
			{
				gps_not_active=0;
				gps_reset=1;
			}
		}
		else
		{
			gps_not_active=0;	
		}
	}
	//高度和卫星数量---GPGGA,100555.00,3905.95420,N,11710.08403,E,1,05,2.64,16.7,M,-3.0,M,,*7F
	else if(strcmp(GPS_MSG_GGA,gps_receive_buffer)==0)
	{	
		//判断参数
		if(gps_argc!=14)return;
									
		//卫星数量
		gps_satellite=atoi(gps_argv[6]);
		//水平可信度
		gps_trueness=atof(gps_argv[7]);
		
		//3D和卫星数量大于6 才能更新坐标
		if(gps_3D==3)
		{
			//送坐标
			if(*gps_argv[1] && gps_argv_length[1]==10)
			{
				temp_latitude=GPSy_to_DUy(gps_argv[1]);
				if(*gps_argv[2]=='S')temp_latitude=-temp_latitude;
			}
			if(*gps_argv[3] && gps_argv_length[3]==11)
			{
				temp_longitude=GPSx_to_DUx(gps_argv[3]);
				if(*gps_argv[4]=='W')temp_latitude=-temp_latitude;
			}
			gps_longitude=temp_longitude;
			gps_latitude=temp_latitude;
		}
		
		//计算高度
		//if(gps_argv[7][0]==0)return;
		//if(gps_argv[8][0]==0)return;
		
		//if(gps_argv[7][0]=='-')temp=0;
		//else temp=atof(gps_argv[7]);
		//gps_height=(long)(temp*1000);
		
		//if(gps_argv[8][0]=='-')temp=0;
		//else temp=atof(gps_argv[8]);
		//gps_height+=(long)(temp*1000);
	}	
	//速度方向---GPVTG,77.52,T,,M,0.004,N,0.008,K,A*06
	else if(strcmp(GPS_MSG_VTG,gps_receive_buffer)==0)
	{
		if(gps_argc!=9)return;
		
		//送速度方向
		if(*gps_argv[0] && *gps_argv[6])
		{
			gps_direction=atoi(gps_argv[0]);
			gps_velocity=atoi(gps_argv[6]);
		}	
	}	
	//GPS天线检测--GPTXT,01,01,02,ANTSTATUS=OK*3B
	else if(strcmp(GPS_MSG_TXT,gps_receive_buffer)==0)
	{	
		//判断参数	
		i=0;
		gps_argc=0;
		while(gps_receive_buffer[i])
		{		
			if(gps_receive_buffer[i]==',')
			{
				gps_receive_buffer[i]=0;
				gps_argv[gps_argc++]=&gps_receive_buffer[i+1];
				if(gps_argc>=GPS_ARGV_NUM)break;
			}
			i++;
		}
		if(gps_argc!=4)return;
		
		//判断是开路,短路 还是OK					
		if(strncmp("ANTSTATUS=OK",gps_argv[3],sizeof("ANTSTATUS=OK")-1)==0){gps_ant_state=1;DEBUG_SEND_STR("GPS天线OK\r\n");}
		else if(strncmp("ANTSTATUS=OPEN",gps_argv[3],sizeof("ANTSTATUS=OPEN")-1)==0){gps_ant_state=2;DEBUG_SEND_STR("GPS天线OPEN\r\n");}
		else if(strncmp("ANTSTATUS=SHORT",gps_argv[3],sizeof("ANTSTATUS=SHORT")-1)==0){gps_ant_state=3;DEBUG_SEND_STR("GPS天线SHORT\r\n");}
	}
}

//***********************************************************************************************************************
//函数作用:初始化
//参数说明:
//注意事项:
//返回说明:返回是否有错误 如果有错误送复位标志
//***********************************************************************************************************************
void gps_init(void)
{
	uchar wait_time;
	
	//没有标志 退出
	if(!gps_reset)return;
	
	
	//1.上电并初始化端口
	DEBUG_SEND_STR("GPS重新上电\r\n");
	GPS_POWER_CTRL=1;
	delay(2);//等待2秒
	GPS_PORTINIT(GPS_BAUDRATE);//初始化端口
	GPS_FLUSH();//清缓冲区
	GPS_POWER_CTRL=0;
		
	//3.等待串口消息
	DEBUG_SEND_STR("GPS通讯检测\r\n");
	wait_time=250;//等待5秒
	while(gps_reset)
	{
		gps_analyse();
		mdelay(20);
 		if(--wait_time==0)goto error;
	}
	GPS_SEND_STR("$PUBX,40,GSA,0,1,0,0*4F\r\n");//打开GSA---定位可信度
	mdelay(100);
	//GPS_SEND_STR("$PUBX,40,GGA,0,0,0,0*5A\r\n");//关闭GGA
	//mdelay(100);
	GPS_SEND_STR("$PUBX,40,RMC,0,0,0,0*47\r\n");//关闭RMC
	//GPS_SEND_STR("$PUBX,40,GSV,1,0,0,0*58\r\n");//打开GSV
	//GPS_SEND_STR("$PUBX,40,GLL,1,0,0,0*5D\r\n");//打开GLL
	
	
	//3.正确返回
	return;
	
error:
	DEBUG_SEND_STR("失败\r\n");
	gps_reset=1;
}

//***********************************************************************************************************************
//函数作用:GPS处理函数
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
void gps_proc(void)
{
	//初始化
	gps_init();
	//接收数据分析
	gps_analyse();
}

//***********************************************************************************************************************
//函数作用:获得天线状态
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
uchar gps_ant(void)
{
	return gps_ant_state;
}

//***********************************************************************************************************************
//函数作用:获得定位可信度
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
float gps_get_trueness(void)
{
	return gps_trueness;
}

//***********************************************************************************************************************
//函数作用:获得卫星数量
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
uchar gps_get_satellite(void)
{
	return gps_satellite;
}

//***********************************************************************************************************************
//函数作用:获得3D标志
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
uchar gps_get_3D(void)
{
	return gps_3D;
}

//***********************************************************************************************************************
//函数作用:获得纬度
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
float gps_lati(void)
{
	return gps_latitude;
}

//***********************************************************************************************************************
//函数作用:获得经度
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
float gps_longti(void)
{
	return gps_longitude;
}

//***********************************************************************************************************************
//函数作用:获得方向
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
uint gps_dir(void)
{
	return gps_direction;
}

//***********************************************************************************************************************
//函数作用:获得速度
//参数说明:
//注意事项:
//返回说明:
//***********************************************************************************************************************
uint gps_speed(void)
{
	return gps_velocity;
}


⌨️ 快捷键说明

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