3

シリアル ポート経由で着信バイトをバッファリングする 3 バイト配列があります。いっぱいになったら、バイトを使用して、バイトと int をパラメーターとして受け取る関数を呼び出したいと思います。これは理論的には問題にならないはずですが、何らかの理由でバイトが適切に int に変換されていません。ここに私が持っているコードがあります:

// for serialEvent()
uint8_t buffer[3] = {0, 0, 0};
uint8_t index = 0;

void serialEvent() {
  while (Serial.available()) {
    if (index > 2) {
      // buffer is full so process it
      uint16_t argument = (uint16_t)buffer[1];
      argument <<= 8;
      argument |= buffer[2];

      processSerial(buffer[0], argument);

      index = 0;
    }

    buffer[index] = Serial.read();

    index++;
  }
}

void processSerial(uint8_t action, uint16_t argument) { ... } 

問題は、最初のビットが左にシフトされて 2 番目のビットのスペースが確保されている行にあるようです。シリアル ポート経由で変数を再度出力しようとしましたが、ビット シフト操作の後、0 です。

ビット シフト演算を 256 の乗算に置き換えようとすると、同じことが起こります (理論的には同じ結果になります)。

いらいらすることに、そのように静的な値を割り当てると、すべてうまくいきます:

uint16_t argument = 0x00CD;
argument <<= 8;

これは型キャストの問題ですか?ここで何か不足していますか?

4

1 に答える 1

0

これが発生する理由についての解決策は見つかりませんでしたが、word()関数を使用すると、私が望むことを正確に実行できます。

uint16_t argument = word(buffer[1], buffer[2]);
processSerial(buffer[0], argument);

迷惑なことに、それは次のように定義されています。

unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; }
于 2012-10-28T18:29:14.557 に答える