0

データを送信するための Bluetooth モジュールで遊んでいます。データには、3 つの回転 (0 ~ 360) と 3 つのボタンの状態 (ビット (0 または 1)) が含まれます。

これを文字列にマッピングしてみました (例: 360_52_265_010% : x_y_z_bbb% % はデータ ストリームを終了するためのマークです) が、これを送信すると実際には最大 16 バイト (多かれ少なかれ) かかります。 )...

これは受け入れがたい。許容できない小さな遅延があるため、次のアイデアを思いつきました。

  • 最大値が 360 であるため、1 つの回転軸 = 9 ビットのデータであり、最大 9 ビットを使用します。
  • ボタンの状態には 3 回のローテーション + 3 ビットが必要なので、合計すると 30 ビットになります。
  • インターウェブで最適なデータ型を検索したところ、Google からフロート (32 ビット) が返されました

Bluetooth接続を介して4バイトが17バイトをはるかに上回るため、これらすべての値を単一のフロートにマッピングすることを考えています(私は思う)

より良い解釈のために、私はうまくいくと思うものをこの美しい表現にしました: ここに画像の説明を入力

現在、ビットシフトの経験はありません。主なコンセプトはわかっていますが、これを機能させることができないようです。私はここここで他のいくつかの投稿を見ましたが、マスクは私を混乱させます.

だから私はそれを求めて、この小さなコードを試しました:

    int xx = 270, yy = 5, zz = 26;
    //3 buttons; left, right, and trigger. I used a byte cause I actually have no idea how I could store just one bit
    byte ll = 0, rr = 0, tt = 1;
    //in here I tried to bitshift the values. Hence the word tried :(
    float packed = (float)(xx << 22 | yy << 13 | zz << 4 | rr << 3 | ll << 2 | tt << 1);

これは 67113578 の float 値を吐き出します (編集これは間違っています。この値は、コンソールに出力するために文字から文字列に変換されました)

そのため、誰かがこれらの値を 1 つの float にパックして元のデータに戻すのを手伝ってくれるかどうか疑問に思っていました。

助けてくれてありがとう!

4

1 に答える 1

1

unsigned longの代わりに使用するfloatか、マシンで 4 バイト幅であることがわかっている符号なし整数型を使用します。すべてのシフトが 1 つずれています。そのはず:

(xx << 21 | yy << 12 | zz << 3 | rr << 2 | ll << 1 | tt);
于 2016-04-23T14:16:53.243 に答える