EC800Z-CN无法下载固件

从代码看,HTTP GET 已经成功进入读取阶段,问题更像是接收侧缓冲和二进制数据解析方式不正确,不是单纯模组无法下载。

建议重点调整以下几点:

  1. 不要用 strstr() 解析固件数据流
    OTA 固件通常是二进制数据,可能包含 0x00\r\n、类似字符串片段。
    strstr((char*)buf, "+QHTTPREAD:") 这类方式只适合文本,不适合直接扫描固件数据,否则可能误判或越界。

  2. AT+QHTTPREAD 发送后不要在无数据时反复重发
    AT+QHTTPREAD=300 后应等待 CONNECT,然后连续接收本次 HTTP 响应数据。
    中途 10 秒无数据就重新发送 AT+QHTTPREAD=300,容易打乱当前 HTTP 读取流程。

  3. 建议关闭响应头
    你当前配置了:

    AT+QHTTPCFG="responseheader",1
    

    OTA 下载建议改为:

    AT+QHTTPCFG="responseheader",0
    

    否则 HTTP Header 会混入读取数据,需要额外剥离,容易导致固件长度统计错误。

  4. 接收逻辑应按固定长度读取
    推荐流程:

    AT+QHTTPGET
    等待 +QHTTPGET: 0,200,<content_len>
    AT+QHTTPREAD=300
    等待 CONNECT\r\n
    之后只按 content_len 字节接收固件正文
    收满 content_len 后再处理尾部 OK / URC
    

    不建议靠 +QHTTPREAD: 字符串判断数据结束。

  5. 检查 MCU 侧 AT 接收缓冲区和串口流控
    每次只能到 3KB 左右,常见原因是 MCU 侧 UART/AT 接收环形缓冲区容量不足或处理不及时。建议:

    • 增大 AT 接收缓冲区;
    • 接收后立即写 Flash,不要长时间打印日志;
    • 降低下载期间 RTT/串口日志频率;
    • 如硬件支持,启用 UART RTS/CTS 硬件流控;
    • 确认 at_recv_get() 返回的数据不是内部缓存上限。
  6. CONNECT 处理处也有丢数据风险
    当前代码在检测到 CONNECT 后,已经执行了一次 at_recv_remove(),后面又执行:

    at_recv_remove(HTTP_CHANNEL, 0, len);
    

    如果 CONNECT\r\n 后面同一个缓冲区里已经带了部分正文数据,这部分数据可能被误删。这里需要只移除 CONNECT\r\n,剩余数据应继续作为固件数据处理。

简要结论:
建议将 HTTP 下载接收改成“CONNECT 后按 content_len 精确接收二进制数据”的状态机,不再用字符串扫描固件内容,同时增大 MCU 侧 AT 接收缓存并减少日志输出。3KB 左右停止通常优先排查接收缓存溢出或误删数据。

本回答仅供参考。若问题已解决,可标记为 :white_check_mark:解决方案 ;若仍有疑问,请等待官方技术人员回复,最终请以专业解答为准。

已解决,采用分片下载就可以了