0

我有来自串行读取的数组,名为sensor_buffer. 它包含 21 个字节。

gyro_out_X=((sensor_buffer[1]<<8)+sensor_buffer[2]);
gyro_out_Y=((sensor_buffer[3]<<8)+sensor_buffer[4]);
gyro_out_Z=((sensor_buffer[5]<<8)+sensor_buffer[6]);
acc_out_X=((sensor_buffer[7]<<8)+sensor_buffer[8]);
acc_out_Y=((sensor_buffer[9]<<8)+sensor_buffer[10]);
acc_out_Z=((sensor_buffer[11]<<8)+sensor_buffer[12]);
HMC_xo=((sensor_buffer[13]<<8)+sensor_buffer[14]);
HMC_yo=((sensor_buffer[15]<<8)+sensor_buffer[16]);
HMC_zo=((sensor_buffer[17]<<8)+sensor_buffer[18]);
adc_pressure=(((long)sensor_buffer[19]<<16)+(sensor_buffer[20]<<8)+sensor_buffer[21]);

这条线有什么作用:

variable = (array_var<<8) + next_array_var

它对8位有什么影响?

<<8  ?

更新:任何其他语言的例子(java,处理)?

处理示例:(为什么使用 H like header?)。

/*
 * ReceiveBinaryData_P
 *
 * portIndex must be set to the port connected to the Arduino
 */
import processing.serial.*;

Serial myPort;        // Create object from Serial class
short portIndex = 1;  // select the com port, 0 is the first port

char HEADER = 'H';
int value1, value2;         // Data received from the serial port

void setup()
{
  size(600, 600);
  // Open whatever serial port is connected to Arduino.
  String portName = Serial.list()[portIndex];
  println(Serial.list());
  println(" Connecting to -> " + Serial.list()[portIndex]);
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  // read the header and two binary *(16 bit) integers:
  if ( myPort.available() >= 5)  // If at least 5 bytes are available,
  {
    if( myPort.read() == HEADER) // is this the header
    {
      value1 = myPort.read();                 // read the least significant byte
      value1 =  myPort.read() * 256 + value1; // add the most significant byte

      value2 = myPort.read();                 // read the least significant byte
      value2 =  myPort.read() * 256 + value2; // add the most significant byte

      println("Message received: " + value1 + "," + value2);
    }
  }
  background(255);             // Set background to white
  fill(0);                     // set fill to black
// draw rectangle with coordinates based on the integers received from Arduino
  rect(0, 0, value1,value2);
}
4

6 回答 6

10

您的代码具有相同的模式:

value = (partial_value << 8) | (other_partial_value)

您的数组以 8 位字节存储数据,但值以 16 位字节存储。每个数据点都是两个字节,最重要的字节首先存储在数组中。该模式通过将最高有效字节向左移动 8 位,然后将最低有效字节 OR'ing 到低 8 位来简单地构建完整的 16 位值。

于 2012-09-11T22:08:37.950 回答
4

它是一个移位运算符。它将变量中的位向左移动 8。向左移动 1 位相当于乘以 2(向右移动除以 2)。所以本质上 <<8 相当于乘以 2^8。

有关 C++ 运算符的列表及其作用,请参见此处: http ://en.wikipedia.org/wiki/C%2B%2B_operators

于 2012-09-11T22:06:37.923 回答
3

<<是左移位运算符,结果是从第一个操作数开始向左移动的位,从右侧填充 0 位。

伪代码中的一个简单示例:

x = 10000101;
x = x << 3;

now x is "00101000"

研究 wikipedia 上的Bitwise operation文章以获得介绍。

于 2012-09-11T22:08:04.017 回答
2

这只是一个位移运算符。If 基本上是取值并将位移到左侧。这相当于将值乘以 2^8。该代码看起来像是读取数组的 2 个字节并从每对中创建一个 16 位整数。

于 2012-09-11T22:09:44.730 回答
2

这似乎sensor_buffer是一个字符矩阵。为了获得您的价值,例如,gyro_out_X您必须结合sensor_buffer[1]and sensor_buffer[2],其中

  • sensor_buffer[1]持有最高有效字节和
  • sensor_buffer[2]保存最低有效字节

在这种情况下

int gyro_out_X=((sensor_buffer[1]<<8)+sensor_buffer[2]);

结合两个字节:

  • 如果sensor_buffer[1]是 0xFF
  • 并且sensor_buffer[2]是 0x10

那么 gyro_out_X 是 0xFF10

于 2012-09-11T22:16:19.250 回答
1

它将位向左移动 8 位,例如:

0000000001000100 << 8 = 0100010000000000

0000000001000100 << 1 = 
0000000010001000 << 1 =
0000000100010000 << 1 =
0000001000100000 << 1 =
0000010001000000 << 1 =
0000100010000000 << 1 =
0001000100000000 << 1 =
0010001000000000 << 1 =
0100010000000000
于 2012-09-11T22:07:51.477 回答