偷个懒,任务又单纯,求高手写个 GPS GNRMC数据压缩函数
本帖最后由 岗本科技 于 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元
本帖最后由 岗本科技 于 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_tGNRMC_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_tGNRMC_UNZIP(uint8_t const *Buffer, uint8_t Len,uint8_t *unzipBuffer,uint8_t *ddmmyy,uint8_t mode);
GNRMC_UNZIP函数收到 压缩的GNRMC数据后,根据参数输出完整的GNRMC数据 希望GNRMC_ZIP函数压缩的越少越好哦 lz什么意思?? LZ的意思是哪个闲得蛋疼的家伙帮忙免费搞一搞{:titter:} rootxie 发表于 2014-5-24 16:05
LZ的意思是哪个闲得蛋疼的家伙帮忙免费搞一搞
也不是哦,一开始以为是简单的工作,但细细想想,发现还是蛮有技术含量的 k_er_tlwei 发表于 2014-5-24 15:54
lz什么意思??
就是帮忙写个函数哦 81莫元?RMB也得考虑考虑
lyrics131415 发表于 2014-5-24 16:25
81莫元?RMB也得考虑考虑
好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元 岗本科技 发表于 2014-5-24 16:44
好吧,人民币也可以 就当请莫坛兄弟吃饭 比值 ·1莫=3元
但纯粹技术讨论帖,效果最好的优选哦,优选好的CODE我也贴出哦,共享给大家 楼主想得真美,别人免费帮你写程序,怎么不叫人帮你把项目也搞好算了 xywap 发表于 2014-5-24 17:06
楼主想得真美,别人免费帮你写程序,怎么不叫人帮你把项目也搞好算了
木有免费啊 楼主想得真美 楼主想得真美 qiqirachel 发表于 2014-5-24 17:41
楼主想得真美
你头像看着很眼熟。。。 qiqirachel 发表于 2014-5-24 17:41
楼主想得真美
我木有想的美,就是想得美 要看数据量有多大……如果足够大,随便移植一下7z的算法(免费开源的),效果绝对令你震撼…… 这种大量重复而且有规律的数据,7z往往能把几十MB的数据压缩成几十KB的 {:victory:}{:victory:}{:victory:} 这个我有做过,楼主联系我吧{:smile:} mhw 发表于 2014-5-24 20:15
这种大量重复而且有规律的数据,7z往往能把几十MB的数据压缩成几十KB的
目前的需求,只要单条GNRMC压缩 不要大数据量压缩 wx85105157 发表于 2014-5-24 17:47
你头像看着很眼熟。。。
{:titter:} 哪里还见过么!!~~~ qiqirachel 发表于 2014-5-25 17:19
哪里还见过么!!~~~
这个头像也眼熟哦 qiqirachel 发表于 2014-5-25 17:19
哪里还见过么!!~~~
想起来了,是《薄荷关系》 岗本科技 发表于 2014-5-25 19:35
这个头像也眼熟哦
那头像是薄荷关系 岗本科技 发表于 2014-5-24 15:16
原始数据如下:
$GNRMC,094211.00,A,2429.34150,N,11710.49027,E,0.341,,160514,,,A*6F
给你另外一种思路,给不给莫元呢{:lol:} nil00 发表于 2014-5-26 10:54
给你另外一种思路,给不给莫元呢
喜大普奔 快说吧 wx85105157 发表于 2014-5-26 10:48
想起来了,是《薄荷关系》
南野诺维尔
(台湾版译为南野诺维)
13岁
目前就读森之宫学园,和玛莉亚是双胞胎姐弟。为了抢回玛莉亚的心,而男扮女装转学到森之宫学园,并且住进女生宿舍和牧村爱莉丝同一寝室。後来渐渐喜欢上爱莉丝。最后,和爱莉丝是男女朋友,和龙至是好友,很喜欢姐姐,风趣可爱的男生。
爱情经历:刚开始有恋姐情节,甚至为了姐姐男扮女装,但后承认了姐姐谈恋爱,大哭一场后发现自己喜欢上了同房爱莉丝。为了和爱莉丝交往,以男装打扮成了"透";果林事件后,和爱莉丝交往了;结果被爱莉丝发现诺维尔是男的,又降级为普通朋友。后来经过种种原因,和爱莉丝成为了男女朋友。
南野玛莉亚
13岁
目前就读森之宫学园,和诺维尔是双胞胎姐弟。和龙至是男女朋友,很疼弟弟,是个全身透露着女孩子味的好女孩。和可南子是好朋友。
爱情经历:本来喜欢广部教练,但教练有女友,于是和教练的弟弟良阳拍拖。因为晶的关系和良阳分手,后接受了大浦,但因为她不是喜欢大浦,于是大浦决定和她分手。接着,龙至喜欢上她,可良阳再次出现,为了龙至拒绝了良阳。后因为克利斯终于与龙至一起。
感情上遭遇许多挫折。不是男友被抢~就是给人甩了......
佐佐龙至
13岁
目前就读森之宫学园,诺维尔的好朋友。在还没发现诺维尔是男生的时候,还~啾~了他一下。知道真相时,却昏倒了(初吻对象是男生嘛),後来喜欢玛莉亚,玛莉亚是男女朋友,与爱莉丝是表姐弟,和诺维尔是好朋友。
爱情经历:小时侯爱上女装的诺维尔,结果把诺维尔和玛莉亚搞混,从此不喜欢女生。但长大后又喜欢上女装的诺维尔,还KISS!!诺维尔又将事情告诉了他,和诺维尔成了好友,经过了种种种种事件后,终于和玛莉亚拍拖了。
牧村爱莉丝
(台湾版:牧村未有)
13岁
目前就读森之宫学园,诺维尔喜欢的人。是个很有个性的女孩。很害怕虫子,之前诺维尔用死蟑螂吓唬她,本以为不会有什么反应的爱莉丝,吓得大叫,并且哭了出来,也因为这件事情而使得两人成为了好友(在还没发诺维尔是男生之前)。後来知道以後,十分生气,后和诺维尔在一起。和诺维尔是男女朋友,与龙至是表兄妹。
爱情经历:很怕生人,诺维尔的出现使她改变,因为受不了诺维尔欺骗她,决定和诺维尔分手。后得知诺维尔还是那么喜欢她,自己很感动,于是原谅了诺维尔,和诺维尔重新拍拖。
好复杂的关系啊 岗本科技 发表于 2014-5-26 11:44
喜大普奔 快说吧
俺曾经也想过直接压缩字符串的问题,可一行这么点数据,目前所有的算法都对它压缩率不高,不如不做。后来,思路一变,有了:
1、先把解析出来成二进制,传输二进制;
2、在接收端,如果需要,再把二进制还原成字符串语句;
这个GPS语句二进制后需要的空间:
经度、纬度、方向各用一个整数(32bit)4个字节表示;
速度2个字节、磁偏角2字节、日期6个字节、时间6个字节,其他标识1个字节(每bit位表示一个),一共29个字节。。。OK
固定长度,数据量都好预测。。。
nil00 发表于 2014-5-26 13:45
俺曾经也想过直接压缩字符串的问题,可一行这么点数据,目前所有的算法都对它压缩率不高,不如不做。后来 ...
目前STM32_Study 同学已经做到了16个字节哦,但我还想压压。。。。 简单提供个思路吧,单条数据不可能做到高压缩比,简单粗暴的方式是转换成二进制传输,经纬度及时间各用32位数据表示,速度和航向可用28位表示,再用4位做数据包标识及简单的奇偶校验,这样下来正好128位16字节。
后来在连续运行一段时间后,发现可以用更好的办法来解决:增量式传输,即先发送包含绝对坐标的数据帧(16字节),后续如果坐标变化不大,只需要发送当前坐标与前一坐标的相对值(9字节)即可,否则重新发送一次绝对坐标值(相当于重新标定)。这样处理,在信号良好的环境下,只要定位成功后,几乎就不需要再传输16字节的绝对坐标了。 看到29楼才明白LZ究竟想干嘛 icoozy 发表于 2014-6-24 17:58
看到29楼才明白LZ究竟想干嘛
呵呵,是啊,语言表述有问题
页:
[1]