📄 gps.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 + -