App Inventor 2 串口通信教程

通过OTG数据线连接Arduino/单片机,实现手机与硬件的串口通信。

一、串口通信 vs 蓝牙

对比项串口(OTG)蓝牙(SPP)
连接方式USB OTG数据线无线
传输速度快(最高115200bps)较慢
稳定性高(有线)一般
使用场景调试、工业设备遥控、IoT
需要配对不需要需要
适用场景:调试Arduino、工业设备通信、需要稳定高速传输时选串口。

二、硬件准备

  1. OTG数据线:手机USB接口 → USB-A母口
  2. USB转串口模块:CH340/CP2102(连接Arduino或单片机)
  3. Arduino/单片机:接收串口指令

三、串口组件用法

3.1 核心方法

方法说明
初始化串口()初始化串口连接
打开串口()打开串口,返回是否成功
关闭串口()关闭串口
发送文本(数据)发送文本(自动加换行)
写串口(数据)发送文本(不加换行)
读串口()读取串口数据

3.2 核心属性

属性说明常用值
波特率(BaudRate)通信速率9600 / 115200
缓冲区大小(BufferSize)接收缓冲区默认即可

四、串口助手App完整代码

4.1 界面设计

┌─────────────────────────────────┐
│  串口助手                        │
│  波特率:[9600▼]  [连接] [断开]  │
├─────────────────────────────────┤
│  接收区:                        │
│  ┌───────────────────────────┐  │
│  │ 收到的数据显示在这里...    │  │
│  └───────────────────────────┘  │
│  [清空接收]  [时间戳 ☑]         │
├─────────────────────────────────┤
│  发送区:                        │
│  [输入发送内容...]  [发送]       │
│  [换行符 ☑]  [HEX模式 ☐]       │
└─────────────────────────────────┘

4.2 完整代码块

初始化全局变量 已连接 = 假
初始化全局变量 接收缓冲 = ""
初始化全局变量 显示时间戳 = 真

// 屏幕初始化
当 Screen1.初始化 时
  设置 串口1.波特率 = 9600
  设置 计时器_接收.计时间隔 = 50    // 50ms轮询一次
  设置 计时器_接收.启用计时 = 假

// 连接串口
当 按钮_连接.被点击 时
  调用 串口1.初始化串口
  如果 调用 串口1.打开串口 则
    设置 全局变量 已连接 = 真
    设置 按钮_连接.启用 = 假
    设置 按钮_断开.启用 = 真
    设置 标签_状态.文本 = "✅ 已连接"
    设置 标签_状态.背景颜色 = 绿色
    设置 计时器_接收.启用计时 = 真
  否则
    调用 对话框1.显示消息对话框(
      "连接失败!\n请检查:\n1. OTG线是否插好\n2. 设备是否支持OTG",
      "错误", "确定")

// 断开串口
当 按钮_断开.被点击 时
  调用 串口1.关闭串口
  设置 全局变量 已连接 = 假
  设置 按钮_连接.启用 = 真
  设置 按钮_断开.启用 = 假
  设置 标签_状态.文本 = "❌ 未连接"
  设置 标签_状态.背景颜色 = 红色
  设置 计时器_接收.启用计时 = 假

// 发送数据
当 按钮_发送.被点击 时
  如果 全局变量 已连接 = 假 则
    调用 对话框1.显示消息对话框("请先连接串口", "提示", "确定")
    返回
  
  初始化局部变量 发送内容 = 文本输入框_发送.文本
  如果 发送内容 ≠ "" 则
    如果 复选框_换行.选中 则
      调用 串口1.发送文本(发送内容)    // 自动加\n
    否则
      调用 串口1.写串口(发送内容)      // 不加\n
    
    // 在发送区显示已发送内容
    调用 追加接收显示(合并字符串("→ ", 发送内容), "发送")

// 定时接收数据
当 计时器_接收.计时 时
  如果 全局变量 已连接 = 真 且 串口1.已初始化 = 真 则
    初始化局部变量 数据 = 调用 串口1.读串口
    如果 数据 ≠ "" 则
      调用 追加接收显示(数据, "接收")

// 追加显示过程
定义 追加接收显示(内容, 类型)
  初始化局部变量 前缀 = ""
  如果 全局变量 显示时间戳 则
    初始化局部变量 时间 = 调用 计时器1.格式化日期时间(调用 计时器1.现在, "HH:mm:ss.SSS")
    设置 前缀 = 合并字符串("[", 时间, "] ")
  
  设置 文本框_接收.文本 = 合并字符串(
    文本框_接收.文本,
    前缀, 内容, "\n"
  )
  // 自动滚动到底部(需要扩展支持)

// 清空接收区
当 按钮_清空.被点击 时
  设置 文本框_接收.文本 = ""

// 切换波特率
当 下拉框_波特率.完成选择 时(选择项, 选择索引)
  设置 串口1.波特率 = 转换为数字(选择项)
  如果 全局变量 已连接 则
    // 重新连接
    调用 串口1.关闭串口
    调用 串口1.初始化串口
    调用 串口1.打开串口

五、Arduino端代码参考

void setup() {
  Serial.begin(9600);
}

void loop() {
  // 接收手机发来的数据
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();
    
    if (cmd == "LED_ON") {
      digitalWrite(13, HIGH);
      Serial.println("LED已开启");
    } else if (cmd == "LED_OFF") {
      digitalWrite(13, LOW);
      Serial.println("LED已关闭");
    } else {
      Serial.println("收到:" + cmd);
    }
  }
  
  // 定时发送传感器数据
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 1000) {
    Serial.println("温度:" + String(analogRead(A0) / 10.0));
    lastSend = millis();
  }
}

六、常见问题

Q1:打开串口失败?

  • 确认手机支持OTG(设置中开启OTG功能)
  • 检查OTG线和USB转串口模块是否正常
  • 部分手机需要在开发者选项中开启USB调试

Q2:接收到乱码?

  • 检查波特率是否与Arduino一致(两端必须相同)
  • 检查编码格式(中文需要UTF-8)

Q3:串口组件在哪里?

连接组件分类中找到”串口通信器(Serial)“。

Q4:串口 vs 蓝牙,哪个更适合遥控小车?

遥控小车推荐蓝牙(无线,方便);调试和工业设备推荐串口(稳定,速度快)。

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。