HC-05串口打印优化:如何实现接收完整文本后再换行输出?
问题描述
我正在使用MIT App Inventor开发多路灯光开关,当通过开关发送文本时,串口监视器会将每个字符单独打印在一行。请问如何修改代码,实现接收完整文本(例如"1on")后再换行输出?
现有代码
const int led1 = 2; const int led2 = 3; const int led3 = 4; char v = 0; void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); } void loop() { if (Serial.available() > 0) { v = Serial.read(); Serial.println(v); // Serial.print('\n'); if (v == 'a') { digitalWrite(led1, HIGH); } else if (v == 'b') { digitalWrite(led1, LOW); } if (v == 'c') { digitalWrite(led2, HIGH); } else if (v == 'd') { digitalWrite(led2, LOW); } if (v == 'e') { digitalWrite(led3, HIGH); } else if (v == 'f') { digitalWrite(led3, LOW); } } }
串口输出截图

解决方案
要实现接收完整文本后再输出,核心思路是缓存接收到的字符,直到识别到一个"结束标记"(比如换行符),再一次性处理并输出完整字符串。
步骤1:修改Arduino代码逻辑,添加字符串缓存
把单个字符变量换成字符串对象来缓存数据,当收到换行符时,再处理完整内容:
const int led1 = 2; const int led2 = 3; const int led3 = 4; String receivedString = ""; // 用于缓存接收的字符串 void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); } void loop() { if (Serial.available() > 0) { char incomingChar = Serial.read(); // 如果收到换行符(结束标记),处理完整字符串 if (incomingChar == '\n') { // 打印完整字符串并换行 Serial.println(receivedString); // 根据完整字符串控制灯光 if (receivedString == "1on") { digitalWrite(led1, HIGH); } else if (receivedString == "1off") { digitalWrite(led1, LOW); } else if (receivedString == "2on") { digitalWrite(led2, HIGH); } else if (receivedString == "2off") { digitalWrite(led2, LOW); } else if (receivedString == "3on") { digitalWrite(led3, HIGH); } else if (receivedString == "3off") { digitalWrite(led3, LOW); } // 清空缓存,准备接收下一组数据 receivedString = ""; } else { // 不是结束标记,就把字符添加到缓存中 receivedString += incomingChar; } } }
步骤2:配置MIT App Inventor发送带换行符的文本
在App Inventor的串口发送模块中,要在发送的文本末尾加上换行符(\n),比如发送"1on\n",确保和Arduino代码中的结束标记一致,这样设备才能识别出完整文本的边界。
关键说明
- 用
String对象缓存字符是最直观的方式,适合小数据量场景;如果追求更低内存占用,也可以用字符数组实现。 - 必须约定好结束标记(换行符是最常用的选择),否则Arduino无法判断什么时候是"完整文本"。
- 修改后,串口监视器只会在收到完整文本时,才会打印整行内容,不会再逐个字符单独换行。
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

