1

wire.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();
4

1 回答 1

3

从这段代码来看,我会说设备将加速度报告为超过 8 位数字,可能是 16 位,但一次只有 8 位......所以假设该acc_x值在您的草图中定义为整数。所以我们一次填充一个 16 位的值 8 位我猜...

所以,Wire.read()可能会得到一个 8 位的值。下一部分<<8将该值向左移动 8 位,有效地将其乘以 256。第二Wire.read部分or与第一个与 ed 相结合|,有效地将其添加到第一个字节。对于设备提供的每个测量值,都会重复此读取移位或过程。

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

回顾一下,16 位数字是通过从第一次读取中获取数字,将其左移以使其位更重要,然后oring(添加)第二次读取的结果来构建的。

正如您的标签所暗示的那样,这称为按位数学或按位操作,这在 Arduino 和所有输入引脚排列在 8 位“端口”中的微控制器平台上很常见,并且这些设备的外围设备也很常见提供它们的数据之一像这样一次一个字节,以减少连接外设的引脚数量。

于 2017-06-05T11:15:40.993 回答