ESP32+INMP441音频存储与上传故障排查求助
问题:ESP32录制音频上传Node.js服务器时文件大小异常(报错-11)
问题概述
- 硬件组合:ESP32 + INMP441麦克风
- 系统流程:录制5秒音频片段(预期20480字节)→ 上传至Node.js服务器(
192.168.1.180:8888)→ Google Speech-to-Text转写 → Java客户端经ChatGPT处理后返回结果至ESP32 - 异常表现:ESP32日志显示音频录制成功(20480字节),但上传阶段提示
Uploading file, size: 8 bytes,并返回错误代码-11;服务器无报错日志,但未接收到音频文件 - 已验证项:WiFi凭据正确,ESP32网络连接正常
排查与调试步骤
1. SPIFFS写入有效性验证(优先排查)
错误代码-11对应ESP-IDF的HTTP_ERROR_WRITE,但文件大小异常(从20480字节变为8字节)大概率源于文件读取前的写入故障:
- 在录制完成后立即添加SPIFFS文件大小校验代码:
File audioFile = SPIFFS.open("/audio.wav", "r"); if (audioFile) { Serial.print("SPIFFS实际文件大小: "); Serial.println(audioFile.size()); audioFile.close(); } else { Serial.println("打开文件失败,无法校验大小"); } - 若校验结果为8字节,说明录制阶段SPIFFS写入失败:
- 检查SPIFFS分区配置:确保分配足够存储空间(建议至少64KB),且分区表未被误修改
- 确认录制时的文件打开模式:必须使用
"wb"(二进制写入),避免文本模式破坏音频二进制数据 - 检查录制循环中的
file.write()调用:验证每次写入的字节数是否符合预期,是否存在写入中断或返回错误
2. 文件句柄与读取逻辑检查
若SPIFFS文件大小正常,但上传时读取异常:
- 确认上传前的文件打开模式:使用
"rb"(二进制读取),且确保文件未被其他进程占用 - 排查文件大小计算逻辑:禁止用
sizeof(audioFile)获取文件大小(该方法返回的是File对象的内存大小,通常为8字节),必须使用audioFile.size() - 重置文件读取指针:上传前调用
audioFile.seek(0),确保从文件起始位置读取数据
3. 网络与HTTP客户端问题排查
若文件读取正常,再定位网络层面问题:
- 开启HTTP客户端调试日志:添加
http_client.setDebugOutput(true),查看HTTP请求的完整交互细节,确认是否存在TCP连接中断或请求头错误 - 验证服务器接收能力:用curl工具直接上传本地音频文件至服务器,确认服务器是否能正常接收:
curl -X POST -F "audio=@local_audio.wav" http://192.168.1.180:8888/upload - 检查Node.js服务器的请求处理逻辑:确保正确配置文件上传中间件(如
multer),设置足够的请求超时时间,且未过滤音频文件类型
关键代码检查点
ESP32上传代码需确认:
- 文件打开、大小读取、指针重置的逻辑顺序是否正确
- HTTP请求的
Content-Length头是否设置为实际文件大小 - 是否使用正确的请求方法(POST)与
Content-Type头(如audio/wav或multipart/form-data)
Node.js服务器代码需确认:
- 是否监听
0.0.0.0:8888而非仅localhost,确保局域网设备可访问 - 文件上传中间件是否正确配置存储路径与文件大小限制
- 是否添加错误捕获逻辑,排查请求体解析失败或文件写入异常的情况
内容的提问来源于stack exchange,提问作者michael lai
相关产品推荐
相关产品推荐

