安信可A7模块GPS数据解析与开发板模块连接

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a710564672/article/details/77435200

==========================================================================

主机操作系统:Centos 6.7 
交叉编译器环境:arm-linux-gcc-4.5.4 (可通过命令/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -v查询)
开发板平台: fl2440 
Linux内核版本: linux-3.0 .54

模块:安信可A7模块
==========================================================================
1.安信可A7模块接线与开启GPS
     首先按照我们之前测试GPRS连线连上模块,波特率为115200.发送AT指令测试是否能用有返回。接着用命令AT+GPS=1打开GPS,返回OK即打开。打开 GPS/AGPS 后,默认 NEMA 信息从 GPS_TXD 管脚以 9600 的波特率输出,如果要让 NEMA 从 AT 串口输出,可以使用 AT+GPSRD。我这里使用AT+GPSRD=3表示每隔3秒输出信息。模块一上电一两分钟后就能正确采集到gps数据了。采集到数据后,关闭串口,把A7模块的接线的TXD线接到模块的GPS数据TXD上,并把波特率设置为9600,打开串口后,可以看到GPS数据每隔1s输出。测试结果如下图所示。

2.GPS数据解析
2.1GPS协议NMEA-0183简介
NMEA 0183是美国国家海洋电子协会(National Marine ElectronicsAssociation)为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritimeservices)标准协议.
    GPS接收机上电后,会自动通过串口或USB口发送NMEA0183格式的数据包,它是一组包含有各种地理位置信息的字符串,字符串格式为:
$信息类型,xxx,xxx,xxx,xxx,xxx,xxx,xxx,
每行开头的字符都是‘$’,接着是信息类型,后面是数据,以逗号分隔开。
信息类型为:
GPGSV:可见卫星信息
GPGLL:地理定位信息
GPRMC:推荐最小定位信息
GPVTG:地面速度信息
GPGGA:GPS定位信息
GPGSA:当前卫星信息

这里我们只解析GPRMC的信息,$GPRMC语句的格式如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh< CR>< LF>
一行完整的数据:
$GPRMC,060916.000,A,3029.65900,N,11423.63928,E,0.00,0.00,120617,,,A*64
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式【6:09:16】
字段2:状态,A=定位,V=未定位【定位】
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)【3029.65900】
字段4:纬度N(北纬)或S(南纬)【北纬】
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)【11423.63928】
字段6:经度E(东经)或W(西经)【东经】
字段7:速度,节,Knots【0.00节】
字段8:方位角,度【0.00】
字段9:UTC日期,DDMMYY格式【120617】
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)【空】
字段11:磁偏角方向,E=东W=西【空】
字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)【自动】
字段13:校验值【校验值为6F】
解析内容:
(1)     时间,这个是格林威治时间,是世界时间(UTC),我们需要把它转换成北京时间(BTC),BTC和UTC差了8个小时,要在这个时间基础上加8个小时。
(2)     定位状态,在接收到有效数据前,这个位是‘V’,后面的数据都为空,接到有效数据后,这个位是‘A’,后面才开始有数据。
(3)     纬度,我们需要把它转换成度分秒的格式,计算方法:
如接收到的纬度是:3029.65900
3029.65900 / 100  =  30.2965900   可以直接读出30度
3029.65900-30 * 100 = 29.65900   可以直接读出29分
29.65900-29 = 0.65900 * 60 = 39.54  读出39秒
所以纬度为:30度29分39秒。
同理经度为:114度23分38分
(4)  南北纬,这个位有两种值‘N’(北纬)和‘S’(南纬)
(5)  经度的计算方法和纬度的计算方法一样
(6)  东西经,这个位有两种值‘E’(东经)和‘W’(西经)
(7)   速率,这个速率值是 海里/时,单位是节,要把它转换成千米/时,根据:1海里 = 1.85公里,把得到的速率乘以1.85。
(8)   航向,指的是偏离正北的角度
(9)   日期,这个日期是准确的,不需要转换
3.关于经纬度的换算:
因为我们收到的经纬度的格式是aabb.mmmm格式,往往要经过换算的。比如百度地图上需要的格式是,xx.mmmmm。这个换算过程其实蛮简单的,大致表示为aa+bb/60+mmmm/60/60。 当然我们也可以用工具进行转换,不过编写程序为了显示需要,需要我们进行换算,所以给出下面简单的算法(存在一定的误差)。
 float caculate(float *x) 
{ 
   int a; 
   float b,c,d,e; 
   a=*x%100;           //30 
   b=(int)((*x/100-a)*100);   //29 
   c=((*x/100-a)*100-b)*60; 

   d=b/60; 
   e=c/60; 

   f=a+d+e; 
   return e;     
} 
计算得到的经纬度度分秒转换为经纬度

在地图工具上查询就能看到我们的位置了

http://www.gpsspg.com/maps.htm GPS转换地址

http://www.ab126.com/Geography/2703.html 经纬度转换
4.用开发板连接模块接收GPS数据:
(1)使能USB接口:         
        因为我们的开发板的两个串口用的是RS232,而我们的模块是TTL电平,所以我们并不能用串口直接去接我们的模块,我们需要用USB转串口线接到开发板的USB口,因此,我们需要对内核进行修改。在内核的make menuconfig->Device Drivers->USB support ->USB Serial Converter support选项中选择USB CP210x family of UART Bridge Controllers 选项,重新编译烧录内核。然后我们把USB转串口线插到我们的开发板USB接口上,通过网线连接开发板,用secuercrt远程登录开发板。我们可以看到/dev目录下有个USB0的设备。
>ls  /dev

(2)microcom命令监听USB接口:
>:microcom -s 9600  /dev/ttyUSB0
-t 单位毫秒,无操作自动退出时间,-s 单位bps,串口波特率,通过ctrl+x可以退出监听。

监听到该接口后,我们可以对该接口进行编程操作,获取经纬度信息。



GPS数据包格式+数据解析  点击打开链接






展开阅读全文

没有更多推荐了,返回首页