GPS项目实战系列之:再谈一次GPS数据解析

之前两篇已经写过GPS芯片解析的话题,今天之所以又写一次,是因为又有了一些的新的内容想和大家分享。

第一个要分享的是,来源于一位网友的留言,

GPS项目实战系列之:再谈一次GPS数据解析

在上一篇文章里,我采用的是用strtok函数进行字段分割,该网友建议试试sscanf,sscanf函数不知道大家平时有没有用过,它用来分割并处理一串数据比较方便。看个小例子,

<code>#include <math.h>

#include <stdio.h>

#include <stdlib.h>


char *tokenstring = "first,25.5,second,15";

int result, i;

double fp;

char o[10], f[10], s[10], t[10];


void main()

{

result = sscanf(tokenstring, "%[^','],%[^','],%[^','],%s", o, s, t, f);

fp = atof(s);

i = atoi(f);

printf("%s %lf %s %d", o, fp, t, i);

}/<stdlib.h>/<stdio.h>/<math.h>/<code>

运行结果如下:

GPS项目实战系列之:再谈一次GPS数据解析

所以用这个sscanf来解析NMEA语句也是可以的,类似上述例子的处理方式就可以,有一点和使用strtok函数一样,要注意处理连续逗号的情况,也可以采用先将连续逗号之间插入特殊字符再解析的办法。

咱们再来看一个sscanf函数的使用例子,

<code>/* sscanf example */

#include <stdio.h>


int main ()

{

char sentence []="Rudolph is 12 years old";

char str [20];

int i;


sscanf (sentence,"%s %*s %d",str,&i);

printf ("%s -> %d",str,i);


return 0;

}/<stdio.h>/<code>

运行结果如下:

GPS项目实战系列之:再谈一次GPS数据解析

通过这个例子,可以看到sscanf函数用起来其实是很灵活的,参数中的星号*表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。关于sscanf函数详细用法,可参考:http://www.cplusplus.com/reference/cstdio/scanf/

它的第二个参数和scanf函数第二个参数用法一样。

第二个要分享的是,有一个网友建议去了解一下nmealib,官方介绍在:http://nmea.sourceforge.net/ ,源码下载地址在:https://sourceforge.net/projects/nmea/files/latest/download

我之前听说过有GPS相关的开源代码,正好就借机去学习了下,这个库用起来挺简单的,我花了点时间将它应用到了ARM Linux下。

使用过程中有几点需要注意的是:

1) 本身这个库对于GGA、RMC语句,只支持GP开头的,即GPGGA、GPRMC,无法处理GNGGA、GNRMC语句,我采用的方法是将读取到的GN开头的语句替换为GP开头,没有修改库本身的源代码,另外需要注意的是要重新生成一个校验值更新过去,否则校验不通过。

2) 传入解析函数nmea_parse的数组必须是\\r\\n结尾,否则也无法正常解析。

3) 解析得到的经纬度格式是度分格式,如果需要使用其他格式,自己得再换算一次。

第三个要分享的是,还有一个网友建议去了解minmea,该源码在:https://github.com/kosma/minmea

GitHub上介绍: a lightweight GPS NMEA 0183 parser library in pure C。

它是一个轻量级的库,并且该网友反馈他在单片机实际项目中用的就是这个。

感兴趣的童靴可以自己去研究研究。

我在它的README文件里看到一句话:Good documentation on NMEA is at https://gpsd.gitlab.io/gpsd/NMEA.html ,提到了一个NEMA比较好的网址,这个网址比绝大多数东抄西抄的中文网址内容要好的多。

我们在平时工作写代码的时候,可以多利用一些开源的代码,它会加速我们的进度,同时开源代码中的编程思想、代码实现细节也值得我们学习和参考。


分享到:


相關文章: