?? gps.c
字號(hào):
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GPS數(shù)據(jù)包處理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*文件名稱:GPS.c
//*文件作用:GPS數(shù)據(jù)包處理
//*文件作者:翟 鵬
//*創(chuàng)建日期:2004年5月
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include <include.h>
//緩沖區(qū)定義
static uchar xdata gps_receive_buffer[GPS_RECEIVE_BUF_SIZE];//接收緩沖區(qū)
static uint xdata gps_buf_point=0;//接收緩沖區(qū)指針
static float xdata gps_longitude=117.238144;//經(jīng)度
static float xdata gps_latitude=39.117604;//緯度
static float xdata temp_longitude=117.238144;//經(jīng)度
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";//時(shí)間
//狀態(tài)位
static uchar xdata gps_reset=1;//需要復(fù)位
static uchar xdata gps_ant_state=0;//GPS天線檢測(cè)
static float xdata gps_trueness=99;//可信度
static uchar xdata gps_satellite=0;//衛(wèi)星數(shù)量
static uchar xdata gps_3D=0;//3D
static uchar xdata gps_not_active=0;//不定位的時(shí)間
//*******************************************************************************************
//函數(shù)作用:GPS坐標(biāo)轉(zhuǎn)化為度
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:無(wú)
//*******************************************************************************************
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;
}
//***********************************************************************************************************************
//函數(shù)作用:接收串口消息
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:如果接受到了完整包 返回1
//***********************************************************************************************************************
static uchar gps_get_msg(void)
{
uchar temp;
//接收直到?jīng)]有數(shù)據(jù)
while(GPS_RECEIVE_CHAR(&temp))
{
DEBUG_SEND_CHAR(temp);
if(temp=='$')
{
gps_buf_point=0;//清緩沖區(qū)指針
}
else if(temp=='\r')//判斷結(jié)束符號(hào)
{
if(gps_buf_point)
{
gps_receive_buffer[gps_buf_point]=0;//添加結(jié)束符
gps_buf_point=0;//清緩沖區(qū)指針
return 1;
}
}
else if(temp=='\n')//過(guò)濾
{
}
else //其他字符送入緩沖區(qū)
{
gps_receive_buffer[gps_buf_point++]=temp;//向緩存送數(shù)據(jù)
if(gps_buf_point>=GPS_RECEIVE_BUF_SIZE-1)gps_buf_point=0;//判斷是否超長(zhǎng)
}
}
return 0;
}
//***********************************************************************************************************************
//函數(shù)作用:處理GPS數(shù)據(jù)
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
static void gps_analyse(void)
{
uchar *gps_argv[GPS_ARGV_NUM];//參數(shù)指針
uchar gps_argv_length[GPS_ARGV_NUM];//參數(shù)長(zhǎng)度
uchar gps_argc;//參數(shù)個(gè)數(shù)
uchar i;
uchar length;
//接收消息
if(!gps_get_msg())return;
//分析參數(shù)
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)
{
//判斷參數(shù)
if(gps_argc!=17)return;
gps_reset=0;
//3D標(biāo)志
gps_3D=atoi(gps_argv[1]);
//長(zhǎng)時(shí)間不定位重新啟動(dòng)
if(gps_3D<2)
{
gps_not_active++;
if(gps_not_active>=88)
{
gps_not_active=0;
gps_reset=1;
}
}
else
{
gps_not_active=0;
}
}
//高度和衛(wèi)星數(shù)量---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)
{
//判斷參數(shù)
if(gps_argc!=14)return;
//衛(wèi)星數(shù)量
gps_satellite=atoi(gps_argv[6]);
//水平可信度
gps_trueness=atof(gps_argv[7]);
//3D和衛(wèi)星數(shù)量大于6 才能更新坐標(biāo)
if(gps_3D==3)
{
//送坐標(biāo)
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;
}
//計(jì)算高度
//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天線檢測(cè)--GPTXT,01,01,02,ANTSTATUS=OK*3B
else if(strcmp(GPS_MSG_TXT,gps_receive_buffer)==0)
{
//判斷參數(shù)
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;
//判斷是開(kāi)路,短路 還是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");}
}
}
//***********************************************************************************************************************
//函數(shù)作用:初始化
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:返回是否有錯(cuò)誤 如果有錯(cuò)誤送復(fù)位標(biāo)志
//***********************************************************************************************************************
void gps_init(void)
{
uchar wait_time;
//沒(méi)有標(biāo)志 退出
if(!gps_reset)return;
//1.上電并初始化端口
DEBUG_SEND_STR("GPS重新上電\r\n");
GPS_POWER_CTRL=1;
delay(2);//等待2秒
GPS_PORTINIT(GPS_BAUDRATE);//初始化端口
GPS_FLUSH();//清緩沖區(qū)
GPS_POWER_CTRL=0;
//3.等待串口消息
DEBUG_SEND_STR("GPS通訊檢測(cè)\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");//打開(kāi)GSA---定位可信度
mdelay(100);
//GPS_SEND_STR("$PUBX,40,GGA,0,0,0,0*5A\r\n");//關(guān)閉GGA
//mdelay(100);
GPS_SEND_STR("$PUBX,40,RMC,0,0,0,0*47\r\n");//關(guān)閉RMC
//GPS_SEND_STR("$PUBX,40,GSV,1,0,0,0*58\r\n");//打開(kāi)GSV
//GPS_SEND_STR("$PUBX,40,GLL,1,0,0,0*5D\r\n");//打開(kāi)GLL
//3.正確返回
return;
error:
DEBUG_SEND_STR("失敗\r\n");
gps_reset=1;
}
//***********************************************************************************************************************
//函數(shù)作用:GPS處理函數(shù)
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
void gps_proc(void)
{
//初始化
gps_init();
//接收數(shù)據(jù)分析
gps_analyse();
}
//***********************************************************************************************************************
//函數(shù)作用:獲得天線狀態(tài)
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
uchar gps_ant(void)
{
return gps_ant_state;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得定位可信度
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
float gps_get_trueness(void)
{
return gps_trueness;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得衛(wèi)星數(shù)量
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
uchar gps_get_satellite(void)
{
return gps_satellite;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得3D標(biāo)志
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
uchar gps_get_3D(void)
{
return gps_3D;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得緯度
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
float gps_lati(void)
{
return gps_latitude;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得經(jīng)度
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
float gps_longti(void)
{
return gps_longitude;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得方向
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
uint gps_dir(void)
{
return gps_direction;
}
//***********************************************************************************************************************
//函數(shù)作用:獲得速度
//參數(shù)說(shuō)明:
//注意事項(xiàng):
//返回說(shuō)明:
//***********************************************************************************************************************
uint gps_speed(void)
{
return gps_velocity;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -