nmealib代码分析
来源:互联网 发布:中国空运交通运输网络 编辑:程序博客网 时间:2024/06/05 17:25
从之前的samples/parse/main.c开始。
以其中的一条GPGGA语句为例。
nmeaINFO结构汇总的是gps数据信息,里面包括utc时间、定位状态、质量因子、经纬度、速度、方向等信息,之所以说是汇总,那是因为这里是对所有的nmea语句进行解析,然后将相应的数据赋值到该结构中,而不仅仅是其中的一条nmea语句,因为一条nmea语句不可能包括所有的gps信息。
nmeaPARSER是解析nmea所需要的一个结构。
然后是nmea_zero_INFO。
最后调用nmea_parse函数对nmea语句进行解析。这个函数有四个参数,分别是nmeaPARSER指针,buff对应需要解析的nmea语句,buff_sz为nmea语句的长度,nmeaINFO指针。
调用nmea_parser_push函数。
在do while里又调用了nmea_parser_real_push函数,这里nparse还是等于buff_sz大小。首先将要解析的nmea字符串拷贝到nmeaPARSER的buffer指针处,注意这里最开始就分配好了1024字节大小的内存空间,然后对nmeaPARSER的buff_use做一个赋值操作,这里赋值为nmea语句的长度值。
到了for循环中,首先调用的是nmea_find_tail函数。这个函数主要干什么的呢,主要是找到nmea语句的结束符"\r\n",并判断其crc值是否正确,如果你私自改了nmea语句中的某个值,而又没有修改crc值,那么这里解析是不会成功的。
如果在其他地方发现了nmea语句的起始符"$",那么证明这条nmea语句是有问题的,直接退出。
那么边计算crc值,边找nmea语句的结束符,如果找到了一个符号"*",那么结束符就在后面的第3、第4个位置处。这里一并将nmea语句中的crc值取出来,并和前面计算的crc值做一个比较,如果不想等,说明这条nmea语句有问题,直接丢弃。最后返回的nread还是nmea语句的长度值。
返回到nmea_parser_real_push函数中,sen_sz不为0,那么自然走下面的else if流程。
然后调用nmea_pack_type函数判断nmea语句的包类型。这里只支持5种类型的nmea语句,有GPGGA、GPGSA、GPGSV、GPRMC和GPVTG,这里只需要判断前5个字符就可以了,返回这个类型值。
如果是GPGGA类型的nmea语句,那自然是调用nmea_parse_GPGGA这个函数对其进行解析了。在这之前首先为nmeaParserNODE和其中的pack申请了内存空间,那么自然这里的解析结果肯定是存储在pack这里了。这里最重要的就是nmea_scanf函数了,这里才是真正的解析nmea语句的函数,这里这个函数的名字也很特别,带了个scanf。
回忆一下c语言中的scanf函数是怎么用的,例如scanf("%d", &val);,等待我们输入一个数字之后,那么最后的结果肯定是存在val中的。
这里的nmea_scanf也是类似的,只是这里的数据是在buff里,数据还是没有变化,还是那一条nmea语句。
nmea_scanf这个函数大家也可以去细看一下,反正最后的解析结果pack这里。
还是回到nmea_parser_real_push函数这里, 最后到了这里:node是找到了,初始时end_node、top_node都是都是为空的,那么都指向这里的node。
回到nmea_parse函数这里。nmea_parser_push函数执行完了,然后是调用nmea_parser_pop函数。首先找到之前的pack,获取他的packType并返回。
如果packType是GPGGA,那么调用nmea_GPGGA2info,而这里的pack也强制转换为了nmeaGPGGA指针。而这个函数自然是对info中的某些数据做了一些赋值操作,包括经纬度、utc时间等。
最后解析结束。
ubox协议下载:http://download.csdn.net/detail/mcgrady_tracy/9407968
参考:http://www.gpsbaby.com/wz/yl.html
http://www.gpsbaby.com/wz/nmea.html
http://aprs.gids.nl/nmea/
以其中的一条GPGGA语句为例。
nmeaINFO结构汇总的是gps数据信息,里面包括utc时间、定位状态、质量因子、经纬度、速度、方向等信息,之所以说是汇总,那是因为这里是对所有的nmea语句进行解析,然后将相应的数据赋值到该结构中,而不仅仅是其中的一条nmea语句,因为一条nmea语句不可能包括所有的gps信息。
nmeaPARSER是解析nmea所需要的一个结构。
然后是nmea_zero_INFO。
这里是对nmeaINFO这个结构中数据进行清零操作,使用nmea_time_now函数对其中utc时间赋一个初值,初值就是当前的系统时间,如果没有从nmea中解析出时间信息,那么最后的结果就是你当前的系统时间。而nmeaINFO中的sig、fix分别是定位状态和定位类型。
紧接着是nmea_parser_init。
最后调用nmea_parse函数对nmea语句进行解析。这个函数有四个参数,分别是nmeaPARSER指针,buff对应需要解析的nmea语句,buff_sz为nmea语句的长度,nmeaINFO指针。
调用nmea_parser_push函数。
在do while里又调用了nmea_parser_real_push函数,这里nparse还是等于buff_sz大小。首先将要解析的nmea字符串拷贝到nmeaPARSER的buffer指针处,注意这里最开始就分配好了1024字节大小的内存空间,然后对nmeaPARSER的buff_use做一个赋值操作,这里赋值为nmea语句的长度值。
到了for循环中,首先调用的是nmea_find_tail函数。这个函数主要干什么的呢,主要是找到nmea语句的结束符"\r\n",并判断其crc值是否正确,如果你私自改了nmea语句中的某个值,而又没有修改crc值,那么这里解析是不会成功的。
如果在其他地方发现了nmea语句的起始符"$",那么证明这条nmea语句是有问题的,直接退出。
那么边计算crc值,边找nmea语句的结束符,如果找到了一个符号"*",那么结束符就在后面的第3、第4个位置处。这里一并将nmea语句中的crc值取出来,并和前面计算的crc值做一个比较,如果不想等,说明这条nmea语句有问题,直接丢弃。最后返回的nread还是nmea语句的长度值。
返回到nmea_parser_real_push函数中,sen_sz不为0,那么自然走下面的else if流程。
然后调用nmea_pack_type函数判断nmea语句的包类型。这里只支持5种类型的nmea语句,有GPGGA、GPGSA、GPGSV、GPRMC和GPVTG,这里只需要判断前5个字符就可以了,返回这个类型值。
如果是GPGGA类型的nmea语句,那自然是调用nmea_parse_GPGGA这个函数对其进行解析了。在这之前首先为nmeaParserNODE和其中的pack申请了内存空间,那么自然这里的解析结果肯定是存储在pack这里了。这里最重要的就是nmea_scanf函数了,这里才是真正的解析nmea语句的函数,这里这个函数的名字也很特别,带了个scanf。
回忆一下c语言中的scanf函数是怎么用的,例如scanf("%d", &val);,等待我们输入一个数字之后,那么最后的结果肯定是存在val中的。
这里的nmea_scanf也是类似的,只是这里的数据是在buff里,数据还是没有变化,还是那一条nmea语句。
nmea_scanf这个函数大家也可以去细看一下,反正最后的解析结果pack这里。
还是回到nmea_parser_real_push函数这里, 最后到了这里:node是找到了,初始时end_node、top_node都是都是为空的,那么都指向这里的node。
回到nmea_parse函数这里。nmea_parser_push函数执行完了,然后是调用nmea_parser_pop函数。首先找到之前的pack,获取他的packType并返回。
如果packType是GPGGA,那么调用nmea_GPGGA2info,而这里的pack也强制转换为了nmeaGPGGA指针。而这个函数自然是对info中的某些数据做了一些赋值操作,包括经纬度、utc时间等。
最后解析结束。
ubox协议下载:http://download.csdn.net/detail/mcgrady_tracy/9407968
参考:http://www.gpsbaby.com/wz/yl.html
http://www.gpsbaby.com/wz/nmea.html
http://aprs.gids.nl/nmea/
0 0
- nmealib代码分析
- nmealib代码分析
- nmealib代码分析
- nmealib代码分析
- GPS nmealib
- GPS nmealib学习笔记
- GPS nmealib学习笔记 .
- GPS-nmealib学习
- GPS nmealib学习笔记
- NMEALIB C GPS 解析
- 分析代码
- 代码分析
- 分析代码
- 代码分析
- 分析代码
- 代码分析
- 代码分析
- 代码分析
- 查看真机中应用程序的文件
- Rxjava学习笔记(一)
- Ubuntu14.04中安装samba服务器实现与Win7的文件共享
- 元素的位置和大小的百分比设置
- jquery
- nmealib代码分析
- 空闲时间学一个Linux命令(10)—— cat 命令
- 面向接口编程(1)--思想基础
- Object_C内存管理
- 初识Spring Boot框架
- configure Spring Data JPA by using XML
- 真正的java的四舍五入
- Python smtplib发送邮件 包含文本、附件、图片等
- Spring 配置 druid数据库连接