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
相关产品推荐
相关产品推荐

