arduino - 加速度计代码中的位移操作

标签 arduino bit-manipulation accelerometer microcontroller bit-shift

我正在对 Arduino 微 Controller 进行编程,我找到了一些用于接受加速度计传感器数据以供以后使用的代码。除了下面的代码之外,我都能理解。我想对正在发生的事情有一些直觉,但在我进行了所有搜索和阅读之后,我无法集中注意力并真正理解正在发生的事情。

我上过一门 C++ 类(class),但我们很少涉及按位运算、位移位或任何你想称之为的东西。让我尝试解释一下我认为我理解的内容,您可以在需要的地方纠正我。

所以:

  1. 我认为我们在 x 中存储了一个值,事实上非常确定。
  2. 看来数组“buff”中的数据(槽号 1)被设置为整数数据类型。
  3. 插槽 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 位标记为 aj:

buff[0] = cdefghij
buff[1] = 000000ab

然后:

buff[1] << 8 = ab00000000

还有:

buff[1] << 8 | buff[0] = abcdefghij

关于arduino - 加速度计代码中的位移操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344233/

相关文章:

objective-c - 如何像 iPhone OS 上的迷宫游戏一样用加速度计编程平滑运动?

c - Arduino Drone项目,当输出为 "loaded"(甚至上限为gnd)时,输入 "steering"命令开始出现故障

error-handling - 'digitalWrite'不能用作功能-newby问题

java - 通过位操作更快地实现 Math.abs()

c - 扩展十六进制数

java - 从字节数组中获取位值

java - 是否可以在 Android 设备上接收超过 315 MHz 的信号?

c++ - 为什么新运算符(operator)会挂起我的程序?

Android 磁力计返回随机值

ios - UILabel 不会更新核心运动闭包内调用的文本