搜索
bottom↓
回复: 32

偷个懒,任务又单纯,求高手写个 GPS GNRMC数据压缩函数

[复制链接]

出0入0汤圆

发表于 2014-5-24 15:16:20 | 显示全部楼层 |阅读模式
本帖最后由 岗本科技 于 2014-5-24 19:02 编辑

原始数据如下:

$GNRMC,094211.00,A,2429.34150,N,11710.49027,E,0.341,,160514,,,A*6F
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,093546.00,A,3119.24689,N,11724.84510,E,1.688,42.69,160514,,,A*5C

数据帧说明:
$GPRMC,<UTC时间>,<有效状态>,<纬度>,<纬度半球>,<经度>,<经度半球>,<地面速率>,<地面航向>,<UTC日期>,<磁偏角>,<磁偏角方向>,<模式指示>*<校验和><CR><LF>
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)


大家伙都说我想的美,好吧

lyrics131415 发表于 2014-5-24 16:25
81莫元?RMB也得考虑考虑


楼主想得真美

岗本科技 发表于 2014-5-24 16:44
好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元

但纯粹技术讨论帖,效果最好的优选哦,优选好的CODE我也贴出哦,共享给大家

好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元

出0入0汤圆

 楼主| 发表于 2014-5-24 15:16:43 | 显示全部楼层
本帖最后由 岗本科技 于 2014-5-24 15:18 编辑

原始数据如下:

$GNRMC,094211.00,A,2429.34150,N,11710.49027,E,0.341,,160514,,,A*6F
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,094215.00,A,2429.34151,N,11710.49092,E,0.370,,160514,,,A*66
$GNRMC,093546.00,A,3119.24689,N,11724.84510,E,1.688,42.69,160514,,,A*5C

数据帧说明:
$GPRMC,<UTC时间>,<有效状态>,<纬度>,<纬度半球>,<经度>,<经度半球>,<地面速率>,<地面航向>,<UTC日期>,<磁偏角>,<磁偏角方向>,<模式指示>*<校验和><CR><LF>
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

函数运行环境:IAR STM32

函数需求:
/*------------------------------------------------------------------------------------------*-
* 函数名称: GNRMC_ZIP()
* 参    数: Buffer:需要压缩的GNRMC数据,Len:需压缩的GNRMC长度,zipBuffer:压缩后的成果数据
* 返    回: 压缩后的数组长度
* 函数功能: GNRMC数据提取与压缩
*              
* 说    明:
*
* 当前版本: V1.0               * 取代版本:
* 作    者:                                * 修    改:  
* 版本信息: 2014-05-22         * 修改信息:
-*-------------------------------------------------------------------------------------------*/
extern uint8_t  GNRMC_ZIP(uint8_t const *Buffer, uint8_t Len,uint8_t *zipBuffer);

GNRMC_ZIP函数收到 完整的GNRMC数据后,
如果 <12> 模式指示==A or D or E /*A=自主定位,D=差分,E=估算,N=数据无效)*/ and <2>定位状态==A  /*A=有效定位,V=无效定位*/  进行数据压缩处理,否则不处理返回0;

GNRMC_ZIP函数只对以下4项数据进行提取与压缩
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)               
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)  可以1.5度一个单位

/*------------------------------------------------------------------------------------------*-
* 函数名称: GNRMC_UNZIP()
* 参    数: Buffer:需要解压缩的GNRMC数据,
             Len:需解压缩的GNRMC长度,
             unzipBuffer:压缩后的成果数据
             ddmmyy:年月日
             mode:模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
* 返    回: 压缩后的数组长度
* 函数功能: GNRMC数据提取与压缩
*              
* 说    明:
*
* 当前版本: V1.0               * 取代版本:
* 作    者:                                * 修    改:  
* 版本信息: 2014-05-22         * 修改信息:
-*-------------------------------------------------------------------------------------------*/
extern uint8_t  GNRMC_UNZIP(uint8_t const *Buffer, uint8_t Len,uint8_t *unzipBuffer,uint8_t *ddmmyy,uint8_t mode);

GNRMC_UNZIP函数收到 压缩的GNRMC数据后,根据参数输出完整的GNRMC数据

出0入0汤圆

 楼主| 发表于 2014-5-24 15:18:46 | 显示全部楼层
希望GNRMC_ZIP函数压缩的越少越好哦

出0入0汤圆

发表于 2014-5-24 15:54:15 | 显示全部楼层
lz什么意思??

出0入0汤圆

发表于 2014-5-24 16:05:22 | 显示全部楼层
LZ的意思是哪个闲得蛋疼的家伙帮忙免费搞一搞

出0入0汤圆

 楼主| 发表于 2014-5-24 16:15:44 | 显示全部楼层
rootxie 发表于 2014-5-24 16:05
LZ的意思是哪个闲得蛋疼的家伙帮忙免费搞一搞

也不是哦,一开始以为是简单的工作,但细细想想,发现还是蛮有技术含量的

出0入0汤圆

 楼主| 发表于 2014-5-24 16:19:40 | 显示全部楼层

就是帮忙写个函数哦

出0入0汤圆

发表于 2014-5-24 16:25:41 | 显示全部楼层
81莫元?RMB也得考虑考虑

出0入0汤圆

 楼主| 发表于 2014-5-24 16:44:35 | 显示全部楼层
lyrics131415 发表于 2014-5-24 16:25
81莫元?RMB也得考虑考虑

好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元

出0入0汤圆

 楼主| 发表于 2014-5-24 16:47:08 | 显示全部楼层
岗本科技 发表于 2014-5-24 16:44
好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元

但纯粹技术讨论帖,效果最好的优选哦,优选好的CODE我也贴出哦,共享给大家

出0入0汤圆

发表于 2014-5-24 17:06:51 来自手机 | 显示全部楼层
楼主想得真美,别人免费帮你写程序,怎么不叫人帮你把项目也搞好算了

出0入0汤圆

 楼主| 发表于 2014-5-24 17:10:54 | 显示全部楼层
xywap 发表于 2014-5-24 17:06
楼主想得真美,别人免费帮你写程序,怎么不叫人帮你把项目也搞好算了

木有免费啊

出0入0汤圆

发表于 2014-5-24 17:41:28 来自手机 | 显示全部楼层
楼主想得真美

出0入0汤圆

发表于 2014-5-24 17:47:05 | 显示全部楼层
楼主想得真美

出0入0汤圆

发表于 2014-5-24 17:47:30 | 显示全部楼层

你头像看着很眼熟。。。

出0入0汤圆

 楼主| 发表于 2014-5-24 18:56:56 | 显示全部楼层

我木有想的美,就是想得美

出0入0汤圆

发表于 2014-5-24 20:14:27 | 显示全部楼层
要看数据量有多大……如果足够大,随便移植一下7z的算法(免费开源的),效果绝对令你震撼……

出0入0汤圆

发表于 2014-5-24 20:15:19 | 显示全部楼层
这种大量重复而且有规律的数据,7z往往能把几十MB的数据压缩成几十KB的

出0入0汤圆

发表于 2014-5-24 20:35:21 | 显示全部楼层

出0入0汤圆

发表于 2014-5-24 15:16:21 | 显示全部楼层
这个我有做过,楼主联系我吧

出0入0汤圆

 楼主| 发表于 2014-5-24 21:04:30 | 显示全部楼层
mhw 发表于 2014-5-24 20:15
这种大量重复而且有规律的数据,7z往往能把几十MB的数据压缩成几十KB的

目前的需求,只要单条GNRMC压缩 不要大数据量压缩

出0入0汤圆

发表于 2014-5-25 17:19:26 | 显示全部楼层
wx85105157 发表于 2014-5-24 17:47
你头像看着很眼熟。。。

哪里还见过么!!~~~

出0入0汤圆

 楼主| 发表于 2014-5-25 19:35:14 | 显示全部楼层
qiqirachel 发表于 2014-5-25 17:19
哪里还见过么!!~~~

这个头像也眼熟哦

出0入0汤圆

发表于 2014-5-26 10:48:19 | 显示全部楼层
qiqirachel 发表于 2014-5-25 17:19
哪里还见过么!!~~~

想起来了,是《薄荷关系》   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-5-26 10:48:39 | 显示全部楼层

那头像是薄荷关系

出0入0汤圆

发表于 2014-5-26 10:54:10 | 显示全部楼层
岗本科技 发表于 2014-5-24 15:16
原始数据如下:

$GNRMC,094211.00,A,2429.34150,N,11710.49027,E,0.341,,160514,,,A*6F

给你另外一种思路,给不给莫元呢

出0入0汤圆

 楼主| 发表于 2014-5-26 11:44:46 | 显示全部楼层
nil00 发表于 2014-5-26 10:54
给你另外一种思路,给不给莫元呢

喜大普奔 快说吧

出0入0汤圆

 楼主| 发表于 2014-5-26 12:28:38 | 显示全部楼层
wx85105157 发表于 2014-5-26 10:48
想起来了,是《薄荷关系》

南野诺维尔

(台湾版译为南野诺维)

13岁

目前就读森之宫学园,和玛莉亚是双胞胎姐弟。为了抢回玛莉亚的心,而男扮女装转学到森之宫学园,并且住进女生宿舍和牧村爱莉丝同一寝室。後来渐渐喜欢上爱莉丝。最后,和爱莉丝是男女朋友,和龙至是好友,很喜欢姐姐,风趣可爱的男生。

爱情经历:刚开始有恋姐情节,甚至为了姐姐男扮女装,但后承认了姐姐谈恋爱,大哭一场后发现自己喜欢上了同房爱莉丝。为了和爱莉丝交往,以男装打扮成了"透";果林事件后,和爱莉丝交往了;结果被爱莉丝发现诺维尔是男的,又降级为普通朋友。后来经过种种原因,和爱莉丝成为了男女朋友。

南野玛莉亚

13岁

目前就读森之宫学园,和诺维尔是双胞胎姐弟。和龙至是男女朋友,很疼弟弟,是个全身透露着女孩子味的好女孩。和可南子是好朋友。

爱情经历:本来喜欢广部教练,但教练有女友,于是和教练的弟弟良阳拍拖。因为晶的关系和良阳分手,后接受了大浦,但因为她不是喜欢大浦,于是大浦决定和她分手。接着,龙至喜欢上她,可良阳再次出现,为了龙至拒绝了良阳。后因为克利斯终于与龙至一起。

感情上遭遇许多挫折。不是男友被抢~就是给人甩了......

佐佐龙至

13岁

目前就读森之宫学园,诺维尔的好朋友。在还没发现诺维尔是男生的时候,还~啾~了他一下。知道真相时,却昏倒了(初吻对象是男生嘛),後来喜欢玛莉亚,玛莉亚是男女朋友,与爱莉丝是表姐弟,和诺维尔是好朋友。

爱情经历:小时侯爱上女装的诺维尔,结果把诺维尔和玛莉亚搞混,从此不喜欢女生。但长大后又喜欢上女装的诺维尔,还KISS!!诺维尔又将事情告诉了他,和诺维尔成了好友,经过了种种种种事件后,终于和玛莉亚拍拖了。

牧村爱莉丝

(台湾版:牧村未有)

13岁

目前就读森之宫学园,诺维尔喜欢的人。是个很有个性的女孩。很害怕虫子,之前诺维尔用死蟑螂吓唬她,本以为不会有什么反应的爱莉丝,吓得大叫,并且哭了出来,也因为这件事情而使得两人成为了好友(在还没发诺维尔是男生之前)。後来知道以後,十分生气,后和诺维尔在一起。和诺维尔是男女朋友,与龙至是表兄妹。

爱情经历:很怕生人,诺维尔的出现使她改变,因为受不了诺维尔欺骗她,决定和诺维尔分手。后得知诺维尔还是那么喜欢她,自己很感动,于是原谅了诺维尔,和诺维尔重新拍拖。


好复杂的关系啊

出0入0汤圆

发表于 2014-5-26 13:45:03 | 显示全部楼层

俺曾经也想过直接压缩字符串的问题,可一行这么点数据,目前所有的算法都对它压缩率不高,不如不做。后来,思路一变,有了:

1、先把解析出来成二进制,传输二进制;
2、在接收端,如果需要,再把二进制还原成字符串语句;

这个GPS语句二进制后需要的空间:
经度、纬度、方向各用一个整数(32bit)4个字节表示;
速度2个字节、磁偏角2字节、日期6个字节、时间6个字节,其他标识1个字节(每bit位表示一个),一共29个字节。。。OK

固定长度,数据量都好预测。。。

出0入0汤圆

 楼主| 发表于 2014-5-26 14:35:13 | 显示全部楼层
nil00 发表于 2014-5-26 13:45
俺曾经也想过直接压缩字符串的问题,可一行这么点数据,目前所有的算法都对它压缩率不高,不如不做。后来 ...

目前STM32_Study 同学已经做到了16个字节哦,但我还想压压。。。。

出0入147汤圆

发表于 2014-5-26 14:56:54 | 显示全部楼层
简单提供个思路吧,单条数据不可能做到高压缩比,简单粗暴的方式是转换成二进制传输,经纬度及时间各用32位数据表示,速度和航向可用28位表示,再用4位做数据包标识及简单的奇偶校验,这样下来正好128位16字节。
后来在连续运行一段时间后,发现可以用更好的办法来解决:增量式传输,即先发送包含绝对坐标的数据帧(16字节),后续如果坐标变化不大,只需要发送当前坐标与前一坐标的相对值(9字节)即可,否则重新发送一次绝对坐标值(相当于重新标定)。这样处理,在信号良好的环境下,只要定位成功后,几乎就不需要再传输16字节的绝对坐标了。

出0入0汤圆

发表于 2014-6-24 17:58:22 | 显示全部楼层
看到29楼才明白LZ究竟想干嘛

出0入0汤圆

 楼主| 发表于 2014-6-26 21:13:37 | 显示全部楼层
icoozy 发表于 2014-6-24 17:58
看到29楼才明白LZ究竟想干嘛

呵呵,是啊,语言表述有问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 01:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表