You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino串口代码异常:输入字符后重复输出问题求助

Arduino串口输入重复输出问题排查

问题代码

void loop() {
  if (Serial.available() > 0) {
    char num = Serial.read();  // Read a single character from serial input
    if (num == '5') {
      Serial.println("hooray!");
    }
    else {
      Serial.println("booo");
    } 
  }
}

异常现象

输入'5'时,串口同时输出"hooray!"和"booo";输入非'5'字符时,会输出两次"booo",与预期的单次输出结果不符。


问题原因

  • 串口监视器默认会在输入字符后,额外发送换行符(\n)或回车符(\r)(取决于右下角的换行设置,常见选项是Newline或Carriage Return + Newline)。
  • 代码每次检测到串口有数据就读取一个字符,因此输入单个字符后,程序会先读取目标字符,紧接着又读取到额外的换行/回车符,两次触发判断逻辑,最终导致重复输出。

解决方法

1. 过滤控制字符

读取字符后先判断是否为换行/回车符,直接跳过这类无效输入:

void loop() {
  if (Serial.available() > 0) {
    char num = Serial.read();
    // 跳过回车和换行控制符
    if (num == '\r' || num == '\n') {
      return;
    }
    if (num == '5') {
      Serial.println("hooray!");
    } else {
      Serial.println("booo");
    }
  }
}

2. 读取整行输入

使用Serial.readStringUntil()一次性读取到换行符为止,只处理有效输入内容:

void loop() {
  if (Serial.available() > 0) {
    // 读取到换行符时停止,获取完整输入
    String input = Serial.readStringUntil('\n');
    // 取输入的第一个字符进行判断(适用于单字符输入场景)
    char num = input.charAt(0);
    if (num == '5') {
      Serial.println("hooray!");
    } else {
      Serial.println("booo");
    }
  }
}

3. 修改串口监视器换行设置

打开Arduino IDE的串口监视器,将右下角的换行选项改为No line ending,这样输入字符时不会额外发送换行/回车符,原代码即可正常运行。


内容的提问来源于stack exchange,提问作者Danny Grogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:40:19