极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16947|回复: 8

字符串压缩解压

[复制链接]
发表于 2014-12-2 18:56:37 | 显示全部楼层 |阅读模式
串口发送的字符串比较长,有没有好的方法将字符串进行压缩然后发送,然后在上位机进行解压还原
回复

使用道具 举报

发表于 2014-12-2 19:43:30 | 显示全部楼层
资源限制应该不能用通用压缩算法,看看你的字符串是什么样子的吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-2 20:04:09 | 显示全部楼层
zoologist 发表于 2014-12-2 19:43
资源限制应该不能用通用压缩算法,看看你的字符串是什么样子的吧?

就是mpu9250的数据,将数据变成字符串了。
回复 支持 反对

使用道具 举报

发表于 2014-12-3 00:25:15 | 显示全部楼层
SproutME 发表于 2014-12-2 20:04
就是mpu9250的数据,将数据变成字符串了。

如果只是一些數值, 不轉成字符已省了很多空位了.
一個 255 的值, 本來只需要 1 個 byte,  轉成字符串就變成 3 個byte了, 而且可能還要加上分隔符號.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 16:40:29 | 显示全部楼层
Super169 发表于 2014-12-3 00:25
如果只是一些數值, 不轉成字符已省了很多空位了.
一個 255 的值, 本來只需要 1 個 byte,  轉成字符串就變 ...

但是串口发送浮点数本来就很麻烦,不知道你有没有好的建议来用串口发送字符串!
回复 支持 反对

使用道具 举报

发表于 2014-12-4 17:13:19 | 显示全部楼层
本帖最后由 Super169 于 2014-12-4 17:15 编辑
SproutME 发表于 2014-12-4 16:40
但是串口发送浮点数本来就很麻烦,不知道你有没有好的建议来用串口发送字符串!


不要把問題想得太複雜, 要緊記通訊只要 arduino 明白就可以了, 不用轉成人看的格式,
一切用原來的格式就是早快最準了.

如果要傅送 浮点数, 就更加要用原數值, 而不是字符.  你覺得麻煩, 只因你用錯了字符.
轉成字符, 不單麻煩, 準確性也是問題, 接收到的可能已不是原來的數了.

以下是一個例子, 讓你明白簡單的 byte to byte 傳送方法.

  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   double a;
  4.   double b;
  5.   uint8_t *src, *desc;
  6.   Serial.begin(57600);
  7.   a = 1.234;
  8.   b = 0;
  9.   src = (uint8_t *) &a;
  10.   desc = (uint8_t *) &b;
  11.   for (int i = 0; i < sizeof(double); i++) {
  12.     *desc++ = *src++;
  13.   }
  14.   Serial.println(sizeof(double));
  15.   Serial.println(a);
  16.   Serial.println(b);
  17. }

  18. void loop() {
  19.   // put your main code here, to run repeatedly:

  20. }
复制代码


以上例子, 只是做了一個簡單的 b=a 功能, 用的就是 byte to byte 的傳送方法.
只要把 for loop 內的做法, 再演變成 其他通訊方式, 任何資料也可以輕易傳送出去.

我不把 serial 的做法直接寫出來, 是希望你也可以思考一下吧.  (其實要改變的也不多.)

明白了道理, 將來想傳送什麼也不是問題了.
回复 支持 反对

使用道具 举报

发表于 2014-12-4 17:20:25 | 显示全部楼层
本帖最后由 Super169 于 2014-12-4 17:34 编辑

如果你真的要傳送字符, 只可以考慮壓縮的程式.
但 單片機的記憶體限制太大了, 要做一個簡單的壓縮程式也不容易, 而且對於短小的宇符, 壓縮程式的效能也很差.  一般 單片機 之間的通訊, 也不會有多大的字符 (總不會要傳送 1MB 的字符吧), 效果未必有想像中的好, 甚至有可能得不償失.

當然, 如果你是在電腦上用, 資源充足的話, 進行壓縮再送出去, 也不是問題.

如果真的要做, 而你的字符都只是基本字符的話, 可以用結合的方式組成新的資料.

例如你的資料只有數字正負及小數點, 用 4 個 bit 可以代表一個值, 那用 一個byte 就可以把兩個字符送出去.
比如 -123.456, 用 A 代表 +, B 代表 -, C 代表點, 就可以轉成 B1, 23, C4, 56 : 4 個 byte , 這可算是比較簡單的方式了.
但其實如果只傳數值, 用原來的數值以 byte to byte 的方式送出去, 就更加節省而且簡單了.

如果你要傳送的有其他字符, 也可以看看你用的數量有多少, 比如只有 16 個以下的變化, 可以用同樣的方式改變合併送出去.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-5 18:23:45 | 显示全部楼层
Super169 发表于 2014-12-4 17:13
不要把問題想得太複雜, 要緊記通訊只要 arduino 明白就可以了, 不用轉成人看的格式,
一切用原來的格式 ...

之前也考虑过直接传二进制的,但是后来发现问题了;我是arduino对processing传数据的。1:数据存放有小端和大端;2,对于arduino比如int是16位的传给PC,int是32位的,位数要匹配;3:数据传输可能是不确定形式的可能是浮点数,整数,还有可能是字符串(这个在提问的时候没有说明白),也有可能是控制指令。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-5 18:24:44 | 显示全部楼层
Super169 发表于 2014-12-4 17:20
如果你真的要傳送字符, 只可以考慮壓縮的程式.
但 單片機的記憶體限制太大了, 要做一個簡單的壓縮程式也不 ...

这个可能还是要有个协议来规定下数据传输
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 07:37 , Processed in 0.059517 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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