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

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

第一个要分享的是,来源于一位微信公众号网友的留言,

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

#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);
}

运行结果如下:

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

/* 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;
}

运行结果如下:

通过这个例子,可以看到这个函数用起来其实是很灵活的,参数中的星号*表示数据是从流 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开头,将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介绍比较好的网址,这个网址比绝大部分中文网站东抄西抄的内容要好的多。

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

0

发表评论