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

ESP32文本文件蓝牙传输至移动应用失败,需实现数据查看与CSV转换

解决方案:ESP32蓝牙文本传输 + MIT App Inventor 全流程实现

一、ESP32端蓝牙串口配置与文件传输代码

采用ESP32经典蓝牙(SPP协议)实现文件传输,该协议在MIT App Inventor中支持更稳定。以下是核心代码:

#include "BluetoothSerial.h"
#include <SPIFFS.h>

BluetoothSerial SerialBT;
const char* fileName = "/data.txt"; // 存储在SPIFFS的目标文本文件

void setup() {
  Serial.begin(115200);
  // 初始化SPIFFS文件系统
  if(!SPIFFS.begin(true)){
    Serial.println("SPIFFS初始化失败");
    return;
  }
  // 开启蓝牙SPP服务,设备名称设为ESP32_File_Transfer
  if(!SerialBT.begin("ESP32_File_Transfer")){
    Serial.println("蓝牙初始化失败");
    return;
  }
  Serial.println("蓝牙已开启,等待移动设备连接");
}

void loop() {
  if(SerialBT.available()){
    String cmd = SerialBT.readStringUntil('\n');
    cmd.trim();
    // 收到APP发送的"SEND_FILE"指令后启动文件传输
    if(cmd == "SEND_FILE"){
      File file = SPIFFS.open(fileName, "r");
      if(!file){
        SerialBT.println("FILE_ERROR");
        return;
      }
      // 先发送文件总大小,方便APP判断接收进度
      SerialBT.println(file.size());
      delay(100);
      // 分块发送文件内容,每块128字节避免缓冲区溢出
      char buffer[128];
      while(file.available()){
        size_t bytesRead = file.readBytes(buffer, sizeof(buffer));
        SerialBT.write(buffer, bytesRead);
        delay(50); // 给APP留足接收处理时间
      }
      file.close();
      SerialBT.println("\nTRANSFER_DONE");
      Serial.println("文件传输完成");
    }
  }
}

代码说明:

  • 先初始化SPIFFS确保能读取内部存储的文本文件
  • 开启蓝牙SPP服务,等待APP连接
  • 响应APP的文件传输指令,分块发送文件内容,附带文件大小和传输结束标识

二、MIT App Inventor端接收与处理逻辑

1. 必备组件

  • BluetoothClient:负责蓝牙连接与数据收发
  • Button:用于触发蓝牙连接、请求文件传输
  • Label:显示连接/传输状态
  • TextBox(设为多行模式):显示接收的文件内容
  • File:处理本地文件存储
  • Notifier:弹出操作提示

2. 核心逻辑步骤

  1. 蓝牙连接:扫描并配对名称为ESP32_File_Transfer的设备,连接成功后更新状态提示
  2. 请求文件:点击按钮向ESP32发送指令SEND_FILE\n
  3. 接收文件:
    • 先读取第一行数据作为文件总大小,存入变量
    • 循环接收字节数据并累加到字符串变量,直到接收字节数达到文件大小,或收到TRANSFER_DONE标识
    • 接收完成后将字符串显示在多行TextBox中

关键注意事项

  • 必须处理分块接收:蓝牙单次传输字节数有限,不能直接读取完整文件内容
  • 加入结束标识:确保APP能准确判断传输完成,避免数据截断
  • 增加延迟配合:ESP32分块发送时加短暂延迟,防止APP接收缓冲区溢出

三、后续功能实现(查看、转CSV、下载分享)

1. 文件内容查看

直接将接收完成的字符串赋值给多行TextBox即可实现内容展示

2. 转换为CSV

如果原文本文件是固定分隔符(如空格、制表符)格式,使用文本替换组件将分隔符替换为逗号即可生成CSV格式字符串。例如原文本每行是2024-05-20 25.6 60,替换空格为逗号后得到2024-05-20,25.6,60

3. 下载与分享

  • 用File组件将CSV字符串写入本地存储(如/storage/emulated/0/Download/data.csv)
  • 用Share组件调用系统分享功能,选择生成的CSV文件即可分享;或直接通过File组件的打开操作触发系统下载/查看流程

四、常见问题排查

  • 传输失败:检查ESP32的SPIFFS是否正确写入目标文件,蓝牙配对是否成功,APP逻辑是否正确处理分块接收
  • 数据截断:确保ESP32分块发送时的延迟设置合理,APP端累计接收字节数与文件大小匹配
  • 蓝牙连接失败:确认ESP32蓝牙名称正确,移动设备蓝牙已开启且未被其他设备占用

内容的提问来源于stack exchange,提问作者Soham Devne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:32:25