==========================================================================
主机操作系统: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数据包格式+数据解析 点击打开链接