从代码看,HTTP GET 已经成功进入读取阶段,问题更像是接收侧缓冲和二进制数据解析方式不正确,不是单纯模组无法下载。
建议重点调整以下几点:
-
不要用
strstr()解析固件数据流
OTA 固件通常是二进制数据,可能包含0x00、\r\n、类似字符串片段。
strstr((char*)buf, "+QHTTPREAD:")这类方式只适合文本,不适合直接扫描固件数据,否则可能误判或越界。 -
AT+QHTTPREAD发送后不要在无数据时反复重发
AT+QHTTPREAD=300后应等待CONNECT,然后连续接收本次 HTTP 响应数据。
中途 10 秒无数据就重新发送AT+QHTTPREAD=300,容易打乱当前 HTTP 读取流程。 -
建议关闭响应头
你当前配置了:AT+QHTTPCFG="responseheader",1OTA 下载建议改为:
AT+QHTTPCFG="responseheader",0否则 HTTP Header 会混入读取数据,需要额外剥离,容易导致固件长度统计错误。
-
接收逻辑应按固定长度读取
推荐流程:AT+QHTTPGET 等待 +QHTTPGET: 0,200,<content_len> AT+QHTTPREAD=300 等待 CONNECT\r\n 之后只按 content_len 字节接收固件正文 收满 content_len 后再处理尾部 OK / URC不建议靠
+QHTTPREAD:字符串判断数据结束。 -
检查 MCU 侧 AT 接收缓冲区和串口流控
每次只能到 3KB 左右,常见原因是 MCU 侧 UART/AT 接收环形缓冲区容量不足或处理不及时。建议:- 增大 AT 接收缓冲区;
- 接收后立即写 Flash,不要长时间打印日志;
- 降低下载期间 RTT/串口日志频率;
- 如硬件支持,启用 UART RTS/CTS 硬件流控;
- 确认
at_recv_get()返回的数据不是内部缓存上限。
-
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 左右停止通常优先排查接收缓存溢出或误删数据。
本回答仅供参考。若问题已解决,可标记为
解决方案 ;若仍有疑问,请等待官方技术人员回复,最终请以专业解答为准。