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. 核心逻辑步骤
- 蓝牙连接:扫描并配对名称为
ESP32_File_Transfer的设备,连接成功后更新状态提示 - 请求文件:点击按钮向ESP32发送指令
SEND_FILE\n - 接收文件:
- 先读取第一行数据作为文件总大小,存入变量
- 循环接收字节数据并累加到字符串变量,直到接收字节数达到文件大小,或收到
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
相关产品推荐
相关产品推荐

