游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

分享一种有趣的数据解析方法

  本篇笔记是一篇开发小结,总结GPS数据的接收、解析示例,以实例为基础分享一些思考过程:GPS数据协议
  常用的GPS模块大多采用NMEA0183协议,目前业已成了GPS导航设备统一的RTCM(RadioTechnicalCommissionforMaritimeservices)标准协议。NMEA0183是美国国家海洋电子协会(NationalMarineElectronicsAssociation)所指定的标准规格,这一标准制订所有航海电子仪器间的通讯标准,其中包含传输资料的格式以及传输资料的通讯协议。
  协议采用ASCII码来传递GPS定位信息,我们称之为帧。
  帧格式形如:aaccc,ddd,ddd,,dddhh(CR)(LF)
  GPS帧数据种类大致如下:
  实际应用中,并不是所有数据都完全用得上,我们可以根据需要选择所需要的数据。
  下面我们以GPGGA数据为例分享接收、解析方法。
  GPGGA语句的基本格式如下:GPGGA,1,2,3,4,5,6,7,8,9,10,11,12,13,14hhCRLF
  举例如下:PGGA,082006。000,3852。9276,N,11527。4283,E,1,08,1。0,20。6,M,,,,000035GPS数据接收
  GPS模块使用串口通信,在解析之前当然需要先接收数据。我这里是在嵌入式Linux平台下做的接收,读串口的接口如:intuartread(voiddata,intdatalen,longtimeout);
  下面分享我在实际应用中的三种接收方法:方法一:粗略法
  为了能快速验证数据解析、跑通整个过程,可以先使用粗略的方法获取数据。粗略法我们可以先不用考虑一帧数据的实际字节数,我们先大致设置一个用于解析的缓冲数组,如:charrxgpsdata〔512〕;
  uartread每次读到的字节数与线程挂起时间有关,粗略法我们大致设置一个串口接收缓冲数组,如:charuartrxbuf〔64〕;
  这时候需要把每次收到的uartrxbuf里的内容自己拼接一下,存放到rxgpsdata中,再去做解析。
  粗略法可以用于快速验证数据解析、跑通整个过程,缺点就是uartrxbuf、rxgpsdata设置得不够合理的话可能会破坏掉大量的数据帧。
  一般我都比较习惯地先快速调通整个流程,再慢慢做优化。方法二:状态机法
  上面的粗略法可能会破坏掉一些数据帧,另外,代码结构可能不够清晰。针对这些问题做改进,使用状态机来接收。一字节一字节地接收,接收完完整一帧数据之后再去做解析。
  代码如:GGA所有状态(GGA数据示例:GPGGA,023543。00,2308。28715,N,11322。09875,E,1,06,1。49,41。6,M,5。3,M,,7D)defineGGASTATESTART0defineGGASTATEHEAD1G1GdefineGGASTATEHEAD2P2PdefineGGASTATEHEAD3G3GdefineGGASTATEHEAD4G4GdefineGGASTATEHEAD5A5AdefineGGASTATEDATA6,023543。00,2308。28715,N,11322。09875,E,1,06,1。49,41。6,M,5。3,M,,defineGGASTATECHECK077defineGGASTATECHECK18Dstaticuint16tggalen0;staticuint8tggastateGGASTATESTART;staticvoidgpsggadataget(charindata){switch(ggastate){caseGGASTATESTART:if(39;indata){ggalen0;memset(rxgpsggadata,0,GGADATAMAXLEN);rxgpsggadata〔ggalen〕indata;ggastateGGASTATEHEAD1G;}else{ggastateGGASTATESTART;}break;caseGGASTATEHEAD1G:if(Gindata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATEHEAD2P;}else{ggastateGGASTATESTART;}break;caseGGASTATEHEAD2P:if(Pindata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATEHEAD3G;}else{ggastateGGASTATESTART;}break;caseGGASTATEHEAD3G:if(Gindata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATEHEAD4G;}else{ggastateGGASTATESTART;}break;caseGGASTATEHEAD4G:if(Gindata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATEHEAD5A;}else{ggastateGGASTATESTART;}break;caseGGASTATEHEAD5A:if(Aindata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATEDATA;}else{ggastateGGASTATESTART;}break;caseGGASTATEDATA:if(indata){rxgpsggadata〔ggalen〕indata;ggastateGGASTATECHECK0;}else{rxgpsggadata〔ggalen〕indata;if(ggalenGGADATAMAXLEN){ggastateGGASTATESTART;}else{ggastateGGASTATEDATA;}}break;caseGGASTATECHECK0:rxgpsggadata〔ggalen〕indata;ggastateGGASTATECHECK1;break;caseGGASTATECHECK1:rxgpsggadata〔ggalen〕indata;printf(ggadata:s,rxgpsggadata);ggastateGGASTATESTART;break;default:break;}}
  这样就可以完整地接收到gga数据,每次走到GGASTATECHECK1状态时的rxgpsggadata就是完整的gga数据,这时候就可以进行解析了,可以在这一步设置一个标志变量表明gga数据已经完全接收完毕,直到数据接收完毕了才做解析。
  这种方法虽然可以比较好地接收数据,在单片机下很好用。但是在这里,相同的线程挂起时间情况下,每次uartread只获取一个字节,这样会损耗一定的接收效率,有点拆东墙补西墙的感觉。在我们这边的应用中,与算法所需的时序要求有冲突了,所以只能再想想其它方法。下面看看方法三。方法三:时间戳法
  这种方法需要明确每一帧数据包含有什么数据,以及数据输出的频率是多少。在相同的线程挂起时间情况下,先把用于uartread接收数据的buffer设置得稍微大一点,看每一次最多能读取到多少个字节得数据以及读完一帧数据需要读几次串口数据。然后我们可以通过时间来区分每一帧数据及每一包串口数据,该重新组包的就重新组包。
  例如:每帧数据间隔200ms,线程挂起时间10ms,一帧数据有130字节,一帧数据由1包、2包串口数据组成,可以通过时间戳来判断每一包之间是数据帧之间的间隔还是每一帧数据里的两个数据包之间的间隔,再做相应的逻辑处理即可很好地接收数据。GPS数据解析
  gps数据怎么解析呢?
  方法可能很多,我们先看一下正点原子的解析方法:
  大概分为两步,第一步先获取逗号的位置确定某个需要解析的字段,然后再将相应字段的字符串数据转换成数字。
  这里分享一种简单实用的解析方法,思路与上面差不多,但是相对比较简单清晰些:staticboolgpsggadataparse(stgpsggadefoutdata,charindata){boolretFALSE;charpggaindata;if(NULLpgga){returnret;}if(NULL!(pggastrstr(pgga,GNGGA))){printf(ggadata:s,pgga);数据校验if(TRUEdatacheck(pgga)){printf(ggadatachecksuccess!);解析出字符串printf(ggadataparse:);for(inti0;iGGASTRMAX;i){sscanf(pgga,〔,〕,gpsggastr〔i〕);printf(s,gpsggastr〔i〕);pggapgga(strlen(gpsggastr〔i〕)1);}字符串转数字outdatalatitudeatof(gpsggastr〔STRLATITUDE〕);outdatalongitudeatof(gpsggastr〔STRLONGITUDE〕);outdatatimeatof(gpsggastr〔STRTIME〕);outdataqualityatof(gpsggastr〔STRQUALITY〕);retTRUE;}else{printf(ggadatacheckerror!);}}returnret;}
  这里使用sscanf正则表达式来做解析。sscanf(pgga,〔,〕,gpsggastr〔i〕);
  sscanf函数在做字符串相关解析时很好用,这里配合正则表达式来使用,上面这一句代码的意思就是从pgga中取逗号前面的数据存放到gpsggastr〔i〕中,因为gga数据都是用逗号隔开的,循环几次就可以把所有数据解析出来,很方便。
  正则表达式学习资源如:1、https:deerchao。cntutorialsregexregex。htm2、https:www。runoob。comregexpregexpsyntax。html
  下面再看一下,sscanf正则表达式的几种简单用法:
  1、取指定长度的字符串。
  如在下例中,取最大长度为4字节的字符串。sscanf(123456,4s,str);
  2、取到指定字符为止的字符串。
  如在下例中,取遇到空格为止字符串。sscanf(123456abcdedf,〔〕,str);
  3、取仅包含指定字符集的字符串。
  如在下例中,取仅包含1到9和小写字母的字符串。sscanf(123456abcdedfBCDEF,〔19az〕,str);
  4、取到指定字符集为止的字符串。
  如在下例中,取遇到大写字母为止的字符串。scanf(123456abcdedfBCDEF,〔AZ〕,str);
  sscanf简单、易理解的正则表达式的方法有时候可以帮助我们很方便地进行字符串数据地解析。sscanf复杂的正则表达式不太建议使用,因为代码可读性太差了。
  另外,使用sscanf正则表达式时有必要写点注释,有见过这种方式还好,有些后面看你代码的人可能没接触过正则表达式可能一时半会儿理解不了。我之前大三出去实习的时候,在公司里就看到这样的代码,那时候知识储备还不够,第一次看到sscanf正则表达式这种解析方法,但是搜索又搜索不到相关答案,很苦恼。所以,平时有必要写一些注释,利人利己。
  参考:
  1、正点原子《ATKNEO6MGPS模块》资料。
  2、https:blog。csdn。netabsurdarticledetails1177092
  猜你喜欢:
  STM32如何收发float类型数据?
  嵌入式中自定义协议的一些典型例子
  1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!

佳能单反相机停产说明了什么?与同行竟争的一种策略,凭着强大的优势,给竟争者来个吓马威。在单反领域始终是排头兵的隹能,生产微单那都不是事儿。日本相机行业的三足鼎立,必将一争。前天刚买了一个新手机,拍出……被批吃相难看!微信拟推出聊天记录付费云存储服务遭吐槽作为一名苦逼的社畜,微信公司群里聊天不敢错过,聊天记录不敢随便删除,就怕哪一天突然要用到,结果一看手机储存容量,微信占据了数十个G。于是,现在越来越多人买手机时较为看重的……为什么阿里不做搜索引擎?阿里是一直在做搜索引擎的,只不过阿里做搜索不叫阿里搜索,但是这并不代表阿里就没有做搜索引擎,比如神马搜索、夸克搜索(夸克浏览器自带搜索引擎)、比如针对性的淘宝商品搜索,1688……选择新能源我只认背景强大的上汽新能源我只认背景强大的厂家上汽。上汽集团是中国汽车界的No。1,非凡汽车是上汽集团打造的中高端智能纯电汽车品牌,目前有2款车型。若论续航,当属飞凡MARVELR,它实现NEDC……Top10丨突破100KM长续航的电动车品牌,你更看好谁?电动车已经不仅仅是代步工具,锂电化、智能化的升级,让人们对于电动车寄予了更多期待。其中,续航是电动车用户一直以来最关注的点,在巅峰时期,国内电动车品牌曾高达3000,到底哪些品……为什么国内的大厂不愿意适配Linux软件,技术实现上很难吗?当然是不愿意,故意的,因为大家看到有QQFORLINUX,但是功能很鸡肋,没法用。技术上不是什么问题,而是限制阻止,应该是不可告人目的。你说的apipost是什么东西,web接……电商实体店,强强联手,共赢才能共生任何红利都有消失的一天,电商也不例外。在同质化加剧,拼价格的电商平台,由于门槛低,鱼龙混杂,产品质量售后服务等参差不齐,严重影响消费者的购买体验,导致其逐渐对电商平台失去……扬杰科技(300373。SZ)拟对外投资引入外部团队共同开发智通财经APP讯,扬杰科技(300373。SZ)发布公告,为了进一步深化行业布局,实现公司的战略发展目标,该公司拟与徐小兵先生、杨兵先生签订合作协议,共同投资设立无锡杰矽微半导……元宇宙到底是个啥全世界似乎都在谈元宇宙。到底什么是元宇宙?它为什么突然火了?它离我们还有多远?比拼想象力的时候到了什么是元宇宙?截至目前,还没有一个被广泛认可的确切定义,人们对它的……吉林省启动赋予科研人员职务科技成果所有权或长期使用权试点记者从省科技厅了解到,我省已启动赋予科研人员职务科技成果所有权或长期使用权试点工作,将职务科技成果所有权由单位所有变为单位与职务科技成果完成人(团队)可以约定所有,促进科技成果……华为加持!续航突破1000公里!零百只要4秒多!随着大家环保意识的提高,对新能源汽车也越来越重视,很多用户也开始选择新能源汽车作为家庭用车,赛力斯华为智选SF5更是用户更优质的选择。从外观来看,赛力斯华为智选SF5绝对……565km续航超ModelY!这样的极星2谁不怕失而复得的第二十四届成都车展,赶在第三季度的尾梢正式开幕,仅延后两天的操作不仅让参会展商少了整天卖车的周末,匆忙的复工节奏也令不少车企的准备颇为慌乱。在这场主题已经被模糊……
Linux简介开源协议是什么?有哪些?如何选择?开源软件在追求自由的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有60多种被开源促进组织(OpenSourceInitiative)认可的开源许可协……苹果盘点苹果秋季新品发布会大家好,我是大家的老朋友数码科技。马上就要进入九月份了,而这也意味着苹果的新品发布会马上就要到来了,而关于苹果新品发布的消息也有很多,可以说是没有断过。数码科技……这还不起飞?细聊比亚迪宋PLUSDMiAWD过去半年的时间里,比亚迪通过DMi平台所取得的成功是有目共睹的,提车需等三个多月就是最好的证明。不过DMi毕竟是一个主打节能的平台,它对于性能的侧重点会少一点。因此,对于……将门虎子有10位首长的儿子在越南牺牲,有多少人记得他们?古时候有句话常被提及:千金之子,坐不垂堂。这句话的含义是家中积累超过千金的富人,坐和卧都不会靠近屋堂的屋檐,怕被屋瓦掉下来砸到。可在新中国成立后的一段特殊岁月里,却有一群……智享升级第14代轩逸推出2021款01hr8月28日,五星安全家轿第14代轩逸正式推出2021款车型。新车携NissanConnect超智联科技,全系标配LED后尾灯、双区独立控制空调等,科技配置进一步升级。新……做推广or做活动,哪种效果好?推广和活动都是必要的,活动搭配推广效果更佳。老板们请明白:做活动绝不仅仅是为了补贴用户,所以千万不要为了做活动而做活动。根据不同的需求进行活动的合理搭配,提升店铺的……消防控制室主机操作流程关注消防卫士一、火警处理当发生火警时,首先应按消音键中止警报声。然后应根据控制器的报警信息检查发生火警的部位,并去现场确认是否有火灾发生。(一)、若确认有火灾……引领创新科技,恒洁23周年庆陕西站活动顺利举办在中国经济崛起和消费自信时代,恒洁通过对中国万千家庭的专业守护,与中国年轻主流消费群体走心的沟通,成为了最中国的卫浴品牌,也成为了中国消费者最青睐的家居新国货品牌之一。近……雷军曾为1个高管,买下1家公司!又拿出15。3亿奖励员工,雷说起雷军,很多人都会想到雷军的一句名言:站在风口上,猪都能飞起来。所以风口理论开始流行,很多人天真地以为小米的成功只是靠风口而已。你回看一下,从2011年2014年,有多少互联……那些年,我们一起走过的95xxx套路曾几何时,95xxx号码都是银行之类的正规公司使用。比如中行服务热线95566,京东服务热线950618等。这也经常让人引入一种错觉:95xxx拨过来的号码,都是正……得罪人系列第三弹小保险公司的产品就一定比大公司要好吗?大家好,我是老李。今天我继续来得罪人。昨天正式的撕了一场逼,结果反而留言更多了,尤其是多保X平台和慧X保险网最有趣,竟然让我来给他们推荐保险,怎么敢的呀,不怕我继续……产品追溯平台AxureRP原型编号:0209产品追溯平台AxureRP原型版权说明:本站所有资料主要来源于网络的公开信息,都保留了原来的版权信息,本站所有的资料文档仅限用于学习交流,如若有侵权的嫌疑,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网