📄 gps.lst
字号:
C51 COMPILER V7.20 GPS 11/03/2007 17:08:50 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE GPS
OBJECT MODULE PLACED IN .\output\GPS.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\device\GPS.c LARGE ORDER INCDIR(.\src\include) DEBUG OBJECTEXTEND PRINT
-(.\output\GPS.lst) OBJECT(.\output\GPS.obj)
line level source
1 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GPS数据包处理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2 //*文件名称:GPS.c
3
4 //*文件作用:GPS数据包处理
5
6 //*文件作者:翟 鹏
7
8 //*创建日期:2004年5月
9 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
10
11
12
13 #include <include.h>
14
15
16
17 //缓冲区定义
18 static uchar xdata gps_receive_buffer[GPS_RECEIVE_BUF_SIZE];//接收缓冲区
19 static uint xdata gps_buf_point=0;//接收缓冲区指针
20 static float xdata gps_longitude=117.238144;//经度
21 static float xdata gps_latitude=39.117604;//纬度
22 static float xdata temp_longitude=117.238144;//经度
23 static float xdata temp_latitude=39.117604;//纬度
24 static uint xdata gps_velocity=0;//速度
25 static uint xdata gps_direction=0;//方向
26 static uchar xdata gps_date_str[]="010101";//日期
27 static uchar xdata gps_time_str[]="160000.00";//时间
28
29
30 //状态位
31 static uchar xdata gps_reset=1;//需要复位
32 static uchar xdata gps_ant_state=0;//GPS天线检测
33 static float xdata gps_trueness=99;//可信度
34 static uchar xdata gps_satellite=0;//卫星数量
35 static uchar xdata gps_3D=0;//3D
36 static uchar xdata gps_not_active=0;//不定位的时间
37
38
39
40 //*******************************************************************************************
41 //函数作用:GPS坐标转化为度
42 //参数说明:
43 //注意事项:
44 //返回说明:无
45 //*******************************************************************************************
46 static float GPSx_to_DUx(char *GPRMC)
47 {
48 1 uint i;
49 1
50 1 i=atoi(GPRMC);
51 1 i/=100;
52 1 return (float)i+atof(GPRMC+3)/60;
53 1 }
54 static float GPSy_to_DUy(char *GPRMC)
C51 COMPILER V7.20 GPS 11/03/2007 17:08:50 PAGE 2
55 {
56 1 uint i;
57 1
58 1 i=atoi(GPRMC);
59 1 i/=100;
60 1 return (float)i+atof(GPRMC+2)/60;
61 1 }
62
63 //********************************************************************************************************
-***************
64 //函数作用:接收串口消息
65 //参数说明:
66 //注意事项:
67 //返回说明:如果接受到了完整包 返回1
68 //********************************************************************************************************
-***************
69 static uchar gps_get_msg(void)
70 {
71 1 uchar temp;
72 1
73 1 //接收直到没有数据
74 1 while(GPS_RECEIVE_CHAR(&temp))
75 1 {
76 2 DEBUG_SEND_CHAR(temp);
77 2
78 2 if(temp=='$')
79 2 {
80 3 gps_buf_point=0;//清缓冲区指针
81 3 }
82 2 else if(temp=='\r')//判断结束符号
83 2 {
84 3 if(gps_buf_point)
85 3 {
86 4 gps_receive_buffer[gps_buf_point]=0;//添加结束符
87 4 gps_buf_point=0;//清缓冲区指针
88 4 return 1;
89 4 }
90 3 }
91 2 else if(temp=='\n')//过滤
92 2 {
93 3
94 3 }
95 2 else //其他字符送入缓冲区
96 2 {
97 3 gps_receive_buffer[gps_buf_point++]=temp;//向缓存送数据
98 3 if(gps_buf_point>=GPS_RECEIVE_BUF_SIZE-1)gps_buf_point=0;//判断是否超长
99 3 }
100 2 }
101 1 return 0;
102 1 }
103
104
105
106 //********************************************************************************************************
-***************
107 //函数作用:处理GPS数据
108 //参数说明:
109 //注意事项:
110 //返回说明:
111 //********************************************************************************************************
-***************
112 static void gps_analyse(void)
C51 COMPILER V7.20 GPS 11/03/2007 17:08:50 PAGE 3
113 {
114 1 uchar *gps_argv[GPS_ARGV_NUM];//参数指针
115 1 uchar gps_argv_length[GPS_ARGV_NUM];//参数长度
116 1 uchar gps_argc;//参数个数
117 1 uchar i;
118 1 uchar length;
119 1
120 1
121 1 //接收消息
122 1 if(!gps_get_msg())return;
123 1
124 1 //分析参数
125 1 i=0;
126 1 gps_argc=0;
127 1 length=0;
128 1 while(gps_receive_buffer[i])
129 1 {
130 2 if(gps_receive_buffer[i]==',')
131 2 {
132 3 gps_receive_buffer[i]=0;
133 3 if(gps_argc)gps_argv_length[gps_argc-1]=length;
134 3 length=0;
135 3 gps_argv[gps_argc++]=&gps_receive_buffer[i+1];
136 3 if(gps_argc>=GPS_ARGV_NUM)break;
137 3 }
138 2 else
139 2 {
140 3 length++;
141 3 }
142 2 i++;
143 2 }
144 1
145 1
146 1 //GPS可信度---GPGSA,A,3,01,05,07,30,14,31,,,,,,,6.99,4.33,5.49*0F
147 1 if(strcmp(GPS_MSG_GSA,gps_receive_buffer)==0)
148 1 {
149 2 //判断参数
150 2 if(gps_argc!=17)return;
151 2
152 2 gps_reset=0;
153 2
154 2 //3D标志
155 2 gps_3D=atoi(gps_argv[1]);
156 2
157 2 //长时间不定位重新启动
158 2 if(gps_3D<2)
159 2 {
160 3 gps_not_active++;
161 3 if(gps_not_active>=88)
162 3 {
163 4 gps_not_active=0;
164 4 gps_reset=1;
165 4 }
166 3 }
167 2 else
168 2 {
169 3 gps_not_active=0;
170 3 }
171 2 }
172 1 //高度和卫星数量---GPGGA,100555.00,3905.95420,N,11710.08403,E,1,05,2.64,16.7,M,-3.0,M,,*7F
173 1 else if(strcmp(GPS_MSG_GGA,gps_receive_buffer)==0)
174 1 {
C51 COMPILER V7.20 GPS 11/03/2007 17:08:50 PAGE 4
175 2 //判断参数
176 2 if(gps_argc!=14)return;
177 2
178 2 //卫星数量
179 2 gps_satellite=atoi(gps_argv[6]);
180 2 //水平可信度
181 2 gps_trueness=atof(gps_argv[7]);
182 2
183 2 //3D和卫星数量大于6 才能更新坐标
184 2 if(gps_3D==3)
185 2 {
186 3 //送坐标
187 3 if(*gps_argv[1] && gps_argv_length[1]==10)
188 3 {
189 4 temp_latitude=GPSy_to_DUy(gps_argv[1]);
190 4 if(*gps_argv[2]=='S')temp_latitude=-temp_latitude;
191 4 }
192 3 if(*gps_argv[3] && gps_argv_length[3]==11)
193 3 {
194 4 temp_longitude=GPSx_to_DUx(gps_argv[3]);
195 4 if(*gps_argv[4]=='W')temp_latitude=-temp_latitude;
196 4 }
197 3 gps_longitude=temp_longitude;
198 3 gps_latitude=temp_latitude;
199 3 }
200 2
201 2 //计算高度
202 2 //if(gps_argv[7][0]==0)return;
203 2 //if(gps_argv[8][0]==0)return;
204 2
205 2 //if(gps_argv[7][0]=='-')temp=0;
206 2 //else temp=atof(gps_argv[7]);
207 2 //gps_height=(long)(temp*1000);
208 2
209 2 //if(gps_argv[8][0]=='-')temp=0;
210 2 //else temp=atof(gps_argv[8]);
211 2 //gps_height+=(long)(temp*1000);
212 2 }
213 1 //速度方向---GPVTG,77.52,T,,M,0.004,N,0.008,K,A*06
214 1 else if(strcmp(GPS_MSG_VTG,gps_receive_buffer)==0)
215 1 {
216 2 if(gps_argc!=9)return;
217 2
218 2 //送速度方向
219 2 if(*gps_argv[0] && *gps_argv[6])
220 2 {
221 3 gps_direction=atoi(gps_argv[0]);
222 3 gps_velocity=atoi(gps_argv[6]);
223 3 }
224 2 }
225 1 //GPS天线检测--GPTXT,01,01,02,ANTSTATUS=OK*3B
226 1 else if(strcmp(GPS_MSG_TXT,gps_receive_buffer)==0)
227 1 {
228 2 //判断参数
229 2 i=0;
230 2 gps_argc=0;
231 2 while(gps_receive_buffer[i])
232 2 {
233 3 if(gps_receive_buffer[i]==',')
234 3 {
235 4 gps_receive_buffer[i]=0;
236 4 gps_argv[gps_argc++]=&gps_receive_buffer[i+1];
C51 COMPILER V7.20 GPS 11/03/2007 17:08:50 PAGE 5
237 4 if(gps_argc>=GPS_ARGV_NUM)break;
238 4 }
239 3 i++;
240 3 }
241 2 if(gps_argc!=4)return;
242 2
243 2 //判断是开路,短路 还是OK
244 2 if(strncmp("ANTSTATUS=OK",gps_argv[3],sizeof("ANTSTATUS=OK")-1)==0){gps_ant_state=1;DEBUG_SEND_STR("GPS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -