wire.Read.Read((<< 8 | wire.Read((做什么?
while(Wire.available() < 14);
until all the bytes are received
acc_x = Wire.read()<<8|Wire.read();
acc_y = Wire.read()<<8|Wire.read();
acc_z = Wire.read()<<8|Wire.read();
temp = Wire.read()<<8|Wire.read();
gyro_x = Wire.read()<<8|Wire.read();
gyro_y = Wire.read()<<8|Wire.read();
gyro_z = Wire.read()<<8|Wire.read();
从此代码判断,我会说设备报告加速度超过8位数字,也许是16位,但一次只有8位...因此,假设acc_x
值在草图中定义为整数。因此,我一次猜到我们猜到了16位值8位...
因此,Wire.read()
可能获得8位值。下一部分<<8
将该值移动,剩下八个位,将其乘以256。第二个Wire.read
是or
,其中第一个带有|
,有效地将其添加到第一个字节中。为设备提供的每种措施重复此读取或过程。
00001010 // let's assume this is the result of the first read
<<8 gives 00001010_00000000
00001111 // let's assume this is the result of the second read
00001010_00000000 | 00001111 // | has the effect of adding here
gives 00001010_00001111 //final acceleration value
因此,回顾一下,通过从第一个读取中获取数字,将其左移动以使其钻头更加重要,然后 or
ing(添加(第二读的结果来构建16位编号。
正如您的标签所建议的那样,这称为位数学或位操作,在Arduino和所有具有8位"端口"的输入引脚的Arduino和所有微控制器平台上很常见,并且对于这些设备提供的外围设备也很常见他们的数据一个字节在这样的时候,以减少与外围的引脚数量。