查看完整版本 : SBus 解碼問題

ghostkcleung 2017-12-16 11:45 PM

SBus 解碼問題

[align=left]如果有玩開遙控模型嘅朋友,[/align]
[align=left]相信都知咩叫做 SBus。[/align]
[align=left]最近有個好奇心想將佢解碼,[/align]
[align=left]除咗逐句左 Shift 右 shift 之外,[/align]
[align=left]我搵唔到快而簡單嘅方法,[/align]
[align=left]呢度有咁多熟 algorithm,[/align]
[align=left]唔知有無辦法解到(用 C/C++),[/align]
[align=left]佢個 Protocol 係咁嘅 ...[/align]

[align=left]25 個 unsigned 8bit byte ( uint8_t )[/align]
[align=left]即係 uint8_t datas[25][/align]
[align=left]datas[0] 必定係 0F。[/align]

[align=left]由 datas[1] 至 datas [22] 有 176 個 bit,[/align]
[align=left]代表 16 個 channel,[/align]
[align=left]換言之每個 channel 有 11bit。[/align]
[align=left]問題就係佢哋排法好麻煩,[/align]

[align=left]( d[x] 即係 datas[x],費事寫咁長 )[/align]

[align=left]ch1=d[2] 後 3 位 + d[1][/align]
[align=left]ch2=d[4] 後 6 位 + d[3] 前 5 位[/align]
[align=left]ch3=d[6] 後 1 位 + d[5] + d[4] 前 2 位[/align]

[align=left]如此類推...例如:[/align]

[align=left]d[0]: 0000 1111 (0x0F) start byte[/align]
[align=left]d[1]: [color=#ff0000]0010 0000[/color] (0x20)[/align]
[align=left]d[2]: [color=#ff00ff]00100[/color] [color=#ff0000]011[/color] (0x23)[/align]
[align=left]d[3]: [color=#0000ff]00[/color] [color=#ff00ff]011100[/color] (0x1C)[/align]
[align=left]d[4]: [color=#0000ff]1111 1010[/color] (0xFA)[/align]
[align=left]d[5]: xxxx xxx[color=#0000ff]0[/color][/align]

[align=left]Parse 出嚟之後就會咁[/align]
ch[0]=800, ch[1]=900, ch[2]=1000

[[i] 本帖最後由 ghostkcleung 於 2017-12-16 11:59 PM 編輯 [/i]]

sswroom 2017-12-17 12:08 AM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-12-16 11:45 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472488604&ptid=27126513][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
如果有玩開遙控模型嘅朋友,
相信都知咩叫做 SBus。
最近有個好奇心想將佢解碼,
除咗逐句左 Shift 右 shift 之外,
我搵唔到快而簡單嘅方法,
呢度有咁多熟 algorithm,
唔知有無辦法解到,
佢個 Prot ... [/quote]這個即是普通LSB方式的BitReader的讀法......
處理速度最快一定是Hard Code Shift, 但不容易讀
要容易讀可以自己寫個BitReader出來

我的BitReader的構造是這樣的:[code]    class BitReaderLSB : public IO::BitReader
    {
    private:
        UInt8 *buff;
        OSInt buffSize;
        OSInt currBytePos;
        OSInt currBitPos;
        IO::Stream *stm;

    public:
        BitReaderLSB(IO::Stream *stm);
        BitReaderLSB(const UInt8 *buff, OSInt buffSize);
        virtual ~BitReaderLSB();

        virtual Bool ReadBits(Int32 *code, OSInt bitCount);
        virtual Bool ByteAlign();
        virtual OSInt ReadBytes(UInt8 *buff, OSInt cnt);
    };[/code]

Susan﹏汪汪 2017-12-17 12:08 AM

唔想寫shift operator 的話
http://en.cppreference.com/w/cpp/language/bit_field

form5 2017-12-17 02:55 AM

[quote]原帖由 [i]ghostkcleung[/i] 於 2017-12-16 11:45 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=472488604&ptid=27126513][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
如果有玩開遙控模型嘅朋友,
相信都知咩叫做 SBus。
最近有個好奇心想將佢解碼,
除咗逐句左 Shift 右 shift 之外,
我搵唔到快而簡單嘅方法,
呢度有咁多熟 algorithm,
唔知有無辦法解到(用 C/C++), ... [/quote]

In [16]: d1 = 0b00100000

In [17]: d2 = 0b00100011

In [18]: d3 = 0b00011100

In [19]: ((d2&0b111)<<8) | d1
Out[19]: 800

In [20]: (( (d3 & 0b111111) << 8) | (d2 & 0b11111000 )) >> 3
Out[20]: 900

ghostkcleung 2017-12-17 09:30 PM

始終係 Hard code 最直接。
雖然會有一堆 Code 。
頁: [1]
查看完整版本: SBus 解碼問題