在Arduino上将字节转换为整数时出现数据丢失

3

我有一个3字节的数组,通过串口缓冲传入的字节。一旦它被填满,我想使用这些字节调用一个需要一个字节和一个整数作为参数的函数。理论上来说这不应该是个问题,但由于某种原因,这些字节没有正确地转换成整数。以下是我写的代码:

// 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) { ... } 

问题似乎在于将第一个位向左移以为第二个位腾出空间的那一行代码。我尝试再次通过串口输出变量,在进行位移操作后它的值为0。
当我尝试用256乘法替换位移操作时(理论上结果相同),同样的情况也发生了。
令人恼火的是,当我像这样分配一个固定值时,所有事情都正常:
uint16_t argument = 0x00CD;
argument <<= 8;

这是类型转换问题吗?我是否漏掉了什么重要细节?

argument |= buffer[2]; 这里应该是想用 buffer[0] 吧? - wildplasser
除了在第四个字节可用之前不进行使用三个解码字节的实际调用,而不是在第三个字节接收后立即进行调用(这是有意义的),我看不出任何明显奇怪的地方。 - Joachim Isaksson
谢谢Joachim,我会稍微重新排列一下这个函数。不过缓冲区索引是正确的。 - theintz
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; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接