SerialRead() 结果为何不是想要的?

代码如下,功能很简单:判断输入的是否为 0xaa, 如果是就输出一段字符,如果不是输出另外一段:

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();
    if (c == 0xaa) {
      Serial.println("Get 0xaa");
    } else {
      Serial.print("Not 0xaa. You have input ");
      Serial.println(c,HEX);
    }
  }
}

实验平台是 Leonardo, 实验结果如下:

运行结果

为什么输入的 0xaa 会被判定为 ffffffaa

在  \arduino-1.8.4\hardware\arduino\avr\cores\arduino\CDC.cpp 有如下定义:

int Serial_::read(void)
{
	if (peek_buffer >= 0) {
		int c = peek_buffer;
		peek_buffer = -1;
		return c;
	}
	return USB_Recv(CDC_RX);
}

对于 0xaa 来说,转换为 int 之后的结果就是 ffffffaa,可以用下面的代码来验证:

char c=0xaa;
Serial.println((int)c,HEX);

结果

知道了原因,修改方法也很简单,在变量声明的地方定义为 byte c 即可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注