SproutME 发表于 2014-12-2 18:56:37

字符串压缩解压

串口发送的字符串比较长,有没有好的方法将字符串进行压缩然后发送,然后在上位机进行解压还原

zoologist 发表于 2014-12-2 19:43:30

资源限制应该不能用通用压缩算法,看看你的字符串是什么样子的吧?

SproutME 发表于 2014-12-2 20:04:09

zoologist 发表于 2014-12-2 19:43 static/image/common/back.gif
资源限制应该不能用通用压缩算法,看看你的字符串是什么样子的吧?

就是mpu9250的数据,将数据变成字符串了。

Super169 发表于 2014-12-3 00:25:15

SproutME 发表于 2014-12-2 20:04 static/image/common/back.gif
就是mpu9250的数据,将数据变成字符串了。

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

SproutME 发表于 2014-12-4 16:40:29

Super169 发表于 2014-12-3 00:25 static/image/common/back.gif
如果只是一些數值, 不轉成字符已省了很多空位了.
一個 255 的值, 本來只需要 1 個 byte,轉成字符串就變 ...

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

Super169 发表于 2014-12-4 17:13:19

本帖最后由 Super169 于 2014-12-4 17:15 编辑

SproutME 发表于 2014-12-4 16:40 static/image/common/back.gif
但是串口发送浮点数本来就很麻烦,不知道你有没有好的建议来用串口发送字符串!

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

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

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

void setup() {
// put your setup code here, to run once:
double a;
double b;
uint8_t *src, *desc;
Serial.begin(57600);
a = 1.234;
b = 0;
src = (uint8_t *) &a;
desc = (uint8_t *) &b;
for (int i = 0; i < sizeof(double); i++) {
    *desc++ = *src++;
}
Serial.println(sizeof(double));
Serial.println(a);
Serial.println(b);
}

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

}

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

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

明白了道理, 將來想傳送什麼也不是問題了.

Super169 发表于 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 個以下的變化, 可以用同樣的方式改變合併送出去.

SproutME 发表于 2014-12-5 18:23:45

Super169 发表于 2014-12-4 17:13 static/image/common/back.gif
不要把問題想得太複雜, 要緊記通訊只要 arduino 明白就可以了, 不用轉成人看的格式,
一切用原來的格式 ...

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

SproutME 发表于 2014-12-5 18:24:44

Super169 发表于 2014-12-4 17:20 static/image/common/back.gif
如果你真的要傳送字符, 只可以考慮壓縮的程式.
但 單片機的記憶體限制太大了, 要做一個簡單的壓縮程式也不 ...

这个可能还是要有个协议来规定下数据传输
页: [1]
查看完整版本: 字符串压缩解压