概述
上一篇已经写过GPS解析的话题,今天之所以又写一次,是因为又有了一些的新的内容想和大家分享。
第一个要分享的是,来源于一位微信公众号网友的留言,
在上一篇文章里,我采用的是用strtok函数进行字段分割,该网友建议试试sscanf,sscanf函数不知道大家平时有没有用过,它用来分割并处理一串数据比较方便。看个小例子,
#include
#include
#include
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
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函数第二个参数用法一样。
我之前听说过有GPS相关的开源代码,正好就借机去学习了下,这个库用起来挺简单的,我花了点时间将它应用到了ARM Linux下。完整工程代码见:
有几点需要注意地方是:
1)本身这个库对于GGA、RMC语句,只支持GP开头的,即GPGGA、GPRMC,无法处理GNGGA、GNRMC语句,我采用的方法是判断如果是GN开头,将GN替换为GP,需要注意的是要重新生成一个校验值更新过去,否则校验不通过。
2)传入解析函数nmea_parse的数组必须是rn结尾,否则也无法正常处理。
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介绍比较好的网址,这个网址比绝大部分中文网站东抄西抄的内容要好的多。
总结:我们在平时工作写代码的时候,也可以多利用一些开源的代码,它会加速我们的进度,同时开源代码中的编程思想、代码实现细节也值得我们学习参考。
2+
最后
以上就是热情树叶为你收集整理的linux gpsd中文版,Linux项目实战之:再谈一次GPS数据解析的全部内容,希望文章能够帮你解决linux gpsd中文版,Linux项目实战之:再谈一次GPS数据解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复