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を使用するのですか?)

/*
 * 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ビットバイトです。各データポイントは2バイトで、最上位バイトが最初に配列に格納されます。このパターンは、最上位バイトを8ビット左にシフトし、最下位バイトを下位8ビットにOR演算することにより、完全な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"

はじめに、ウィキペディアのビット演算の記事を調べてください。

于 2012-09-11T22:08:04.017 に答える
2

それsensor_bufferは文字の行列のようです。あなたの価値を得るために、例えばgyro_out_Xあなたはとを組み合わせる必要がsensor_buffer[1]ありますsensor_buffer[2]、ここで

  • sensor_buffer[1]最上位バイトを保持し、
  • sensor_buffer[2]最下位バイトを保持します

その場合

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

2バイトを結合します。

  • sensor_buffer[1]0xFFの場合
  • そしてsensor_buffer[2]0x10です

その場合、gyro_out_Xは0xFF10です

于 2012-09-11T22:16:19.250 に答える
2

これは単なるビットシフト演算子です。基本的に値を取得し、ビットを左に配置する場合。これは、値に2^8を掛けることと同じです。このコードは、配列の2バイトを読み取り、各ペアから16ビット整数を作成するように見えます。

于 2012-09-11T22:09:44.730 に答える
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 に答える