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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:25:54