シリアル ポート経由で着信バイトをバッファリングする 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;
これは型キャストの問題ですか?ここで何か不足していますか?