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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:16:13