gps模块协议NMEA-0183的解析----android4.2下的gps hal层

这些天调试了一款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在数据格式、数据位上还是有一定的差异,这是因为国内加入了北斗卫星,国内制度了一些标准:交通部的标准、北斗推广小组的标准,它们之间的差异可以查看我的资源:

http://download.csdn.net/detail/tanxjian/7030705


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

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

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

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

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

具体的代码见我的资源:http://download.csdn.net/detail/tanxjian/7031735






  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
下面是一个简单的NMEA-0183协议解析代码的C语言实现示例。 ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_NMEA_SENTENCE_LENGTH 80 typedef struct { int hour; int minute; int second; float latitude; float longitude; float altitude; int fix_quality; int num_satellites; } GPSData; void parse_nmea_sentence(char* sentence, GPSData* gps_data) { char* tokens[20]; int num_tokens = 0; char* token = strtok(sentence, ","); while (token != NULL) { tokens[num_tokens++] = token; token = strtok(NULL, ","); } if (strcmp(tokens[0], "$GPGGA") == 0) { // 解析GGA语句 if (num_tokens >= 10) { gps_data->hour = atoi(tokens[1]) / 10000; gps_data->minute = (atoi(tokens[1]) / 100) % 100; gps_data->second = atoi(tokens[1]) % 100; gps_data->latitude = (float)atof(tokens[2]); gps_data->longitude = (float)atof(tokens[4]); gps_data->altitude = (float)atof(tokens[9]); gps_data->fix_quality = atoi(tokens[6]); gps_data->num_satellites = atoi(tokens[7]); } } } int main() { char nmea_sentence[MAX_NMEA_SENTENCE_LENGTH]; GPSData gps_data = {0}; while (fgets(nmea_sentence, MAX_NMEA_SENTENCE_LENGTH, stdin) != NULL) { if (nmea_sentence[strlen(nmea_sentence) - 1] == '\n') { nmea_sentence[strlen(nmea_sentence) - 1] = '\0'; } parse_nmea_sentence(nmea_sentence, &gps_data); printf("Latitude: %f, Longitude: %f, Altitude: %f\n", gps_data.latitude, gps_data.longitude, gps_data.altitude); } return 0; } ``` 在这个示例中,我们定义了一个GPSData结构体来存储解析出来的位置信息,同时实现了一个parse_nmea_sentence函数来解析NMEA-0183协议语句。在主函数中,我们从标准输入流中读取NMEA-0183协议语句,并将解析出来的位置信息打印出来。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

module_exit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值