0

我一直在玩蓝牙模块来发送数据。数据包含 3 个旋转 (0-360) 和 3 个按钮状态(位(0 或 1))。

我尝试将它映射到一个字符串(即:360_52_265_010% : x_y_z_bbb% 其中 % 是结束数据流的标记)但发送它实际上需要 16 个字节(或多或少),因为每个小字母都是一个字符(8 位)...

这是无法接受的。我有一个我无法容忍的小延迟,所以我想出了这个主意:

  • 一个旋转轴 = 9 位数据,因为最大值为 360,最多占用 9 位
  • 对于按钮状态,我们需要 3 次旋转 + 3 位,因此总共需要 30 位。
  • 在互联网上搜索最佳数据类型,谷歌给了我一个浮点数(32 位)

现在我正在考虑将所有这些值映射到一个浮点数中,因为 4 字节通过蓝牙连接远远超过 17 字节(我认为)

为了更好地解释,我对我认为应该起作用的东西做了这个漂亮的表示: 在此处输入图像描述

现在,我有 0 位移位经验。好吧,我知道主要概念,但我似乎无法让它发挥作用。我在这里这里查看了其他一些帖子,但面具让我感到困惑。

所以我就去做了,并尝试了这段小代码:

    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(编辑这是错误的,由于将其打印到我的控制台,该值已从字符转换为字符串)

所以我想知道是否有人可以帮助我将这些值打包到一个浮点数中并返回到我的原始数据。

感谢您的帮助!

4

1 回答 1

1

使用unsigned long而不是float,或者您知道的任何无符号整数类型在您的机器中是 4 字节宽。你所有的班次都减一。它应该是:

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