这些天调试了一款GPS模组,对GPS的数据格式协议NMEA-0183有了一些了解,现把这些天的心得体会记录下来。


GPS 模块硬件介绍:

国内的一款GPS模组,使用uart接口与主控进行通信,这款GPS模组只需要供电、使能就能够工作,不需要下载固件、配置文件等。


GPS模组上报给主控的GPS数据是有一定的协议的,目前国际上主要的gps数据协议是NMEA-0183,具体的我就不介绍了,只介绍几个常用的数据:

$GPGGA: GPS定位主要数据,包括经纬度、质量因子、HDOP、高程、参考站号等字段
$GPGSA: 当前定位使用卫星的信息。
$GPGSV: 可见卫星信息。
$GPRMC: 推荐定位信息,经过前后信息对比误差处理过。
$GPVTG: 地面速度信息。
$GPGLL: 定位地理信息。

来看看我调试的gps数据:

$GNGGA,021830.39,2303.7670,N,11323.9932,E,1,03,12.7,14.7,M,-7.8,M,,*60
 $GPGSA,A,2,26,15,,,,,,,,,,,12.7,12.7,1.0*32
 $BDGSA,A,2,14,,,,,,,,,,,,12.7,12.7,1.0*26
 $GNGLL,2303.7670,N,11323.9932,E,021830.39,A,A*72
 $GPGSV,4,1,13,15,53,013,38,26,20,038,31,02,05,144,,05,22,084,*75
 $GPGSV,4,2,13,06,00,000,,11,10,000,,12,20,164,,14,04,237,*7F
 $GPGSV,4,3,13,18,30,315,,21,52,313,,22,02,295,,24,59,143,*74
 $GPGSV,4,4,13,29,24,218,*4D
 $BDGSV,4,1,16,14,49,353,31,01,00,180,,02,10,180,,03,20,180,*6F
 $BDGSV,4,2,16,04,30,180,,05,40,180,,06,54,025,,07,60,162,*6B
 $BDGSV,4,3,16,08,17,187,,09,47,335,,10,38,190,,11,50,180,*69
 $BDGSV,4,4,16,12,60,180,,13,70,180,,15,80,180,,16,90,180,*6D
 $GNVTG,343.0,T,,,6.253,N,11.603,K,A*6D
 $GNRMC,021830.39,A,2303.7670,N,11323.9932,E,6.253,343.0,110314,,,A*45

查看这段数据后,发现有GNxxx、GPxxx、BDxxx等数据头,与NMEA-0183标准好像不太一样,这里是不一样的,因为这款gps模组是国内的,支持gps、北斗定位两款定位系统,其中的GPxxx代表的gps的数据,BDxxx代表的北斗的数据,其中还有GNxxx的,GN开头代表是gps、北斗共同的信息,都是一些定位(经纬度、高度、速度、方位等)的信息。

这段数据与标准的NMEA-0183在数据格式、数据位上还是有一定的差异,这是因为国内加入了北斗卫星,国内制度了一些标准:交通部的标准、北斗推广小组的标准,它们之间的差异可以查看我的资源:



搞定硬件后,确被告知模组厂商以前没有做过Android下的项目,所以没有现成的android下的gps HAL层代码,没辙了,参考网上的资料自己弄吧!随便从网上下载了一个,解决编译错误后,放进系统,居然能定位,但是还是有一些问题:

1、使用gps test工具测试,能搜索到卫星且也能够定位,但是已使用的卫星个数一直为零。(北斗数据覆盖了gps数据导致)

2、信号为零的卫星也显示。(修改代码逻辑,将信号大于零才加入卫星列表)

3、只有定到位置后才显示卫星。(修改代码只要有卫星有信号,就上报android系统)

4、与gps模组原始数据对比,有丢失卫星的现象。(标准不一样,gps上报的数据位数不一样,导致解析错误。)