我正在对 Arduino 微 Controller 进行编程,我找到了一些用于接受加速度计传感器数据以供以后使用的代码。除了下面的代码之外,我都能理解。我想对正在发生的事情有一些直觉,但在我进行了所有搜索和阅读之后,我无法集中注意力并真正理解正在发生的事情。
我上过一门 C++ 类(class),但我们很少涉及按位运算、位移位或任何你想称之为的东西。让我尝试解释一下我认为我理解的内容,您可以在需要的地方纠正我。
所以:
- 我认为我们在 x 中存储了一个值,事实上非常确定。
- 看来数组“buff”中的数据(槽号 1)被设置为整数数据类型。
- 插槽 1 中的值向左移动 8 位。(这是否指向缓冲插槽 0?)
这个新值正在与缓冲槽 0 中的数据进行比较,如果任一位为真,则 x 中存储的数据中的位也将为真,因此 0 和 1 = 1、0 和 0 = 0 和 1最终存储的值是 0 = 1。
代码对所有三个轴执行此操作:x、y、z,但我不确定为什么......我需要帮助。在我进步之前我希望得到充分的理解。
//each axis reading comes in 10 bit resolution, ie 2 bytes.
// Least Significant Byte first!!
//thus we are converting both bytes in to one int
x = (((int)buff[1]) << 8) | buff[0];
y = (((int)buff[3]) << 8) | buff[2];
z = (((int)buff[5]) << 8) | buff[4];
最佳答案
此代码用于将原始加速度计数据(在 6 字节数组中)转换为三个 10 位整数值。正如评论所说,数据是LSB优先。即:
buff[0] // least significant 8 bits of x data
buff[1] // most significant 2 bits of x data
buff[2] // least significant 8 bits of y data
buff[3] // most significant 2 bits of y data
buff[4] // least significant 8 bits of z data
buff[5] // most significant 2 bits of z data
它使用按位运算符将两个部分组合到一个变量中。 (int)
类型转换是不必要的并且(恕我直言)令人困惑。这个简化的表达式:
x = (buff[1] << 8) | buff[0];
获取 buff[1]
中的数据,并将其左移 8 位,然后将 buff[0]
中的 8 位放入如此创建的空间中。为了举例,我们将 10 位标记为 a
到 j
:
buff[0] = cdefghij
buff[1] = 000000ab
然后:
buff[1] << 8 = ab00000000
还有:
buff[1] << 8 | buff[0] = abcdefghij
关于arduino - 加速度计代码中的位移操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344233/