为什么串行值打印两次以及未发送的值?

时间:2017-06-07 08:16:10

标签: arduino serial-port

使用下面的代码,我试图打印通过Arduino序列接收的值。但是价值会被打印两次。并且打印值中的一个始终为0.

byte b;
int i;

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(10);
}

void loop() {
  while(Serial.available() == 0) {}
  i = Serial.parseInt();
  Serial.println(i);
}

EXAMPLE: value sent is 15
Serial monitor output: 15
                       0

EXAMPLE: value sent is 99
Serial monitor output: 99
                       0

2 个答案:

答案 0 :(得分:4)

这是因为第一个i = Serial.parseInt();打印读取值并将0返回到i变量,这意味着该值已成功打印。

在第二个Serial.println(i);上,您只需打印i值,即0。

答案 1 :(得分:1)

我假设您从串行监视器发送换行符。

这是您的代码中发生的事情。

  1. 您正在发送15\n
  2. Serial.parseInt()从串行缓冲区中读取15,并在\n处停止。然后它返回15
  3. 由于\n仍在缓冲区中,Serial.parseInt()会再次被调用。
  4. Serial.parseInt()会丢弃串行缓冲区中的任何非数字字符,直到找到数字字符。
  5. 删除\n并等待数字字符。
  6. Serial.parseInt()超时并返回0
  7. 如果您想阻止第二次Serial.parseInt()调用,您应该发送不带换行符的字符串或清空串行缓冲区,如下所示:

    void loop() {
      while(Serial.available() == 0) {}
      i = Serial.parseInt();
      Serial.println(i);
      while(Serial.available() > 0) Serial.read(); // empty the serial buffer by reading everything from it
    }