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

问题似乎出在第一位向左移动以为第二位腾出空间的行中。我已经尝试再次通过串行端口输出变量,并且在位移操作之后,它是 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 回答