硬件: ESP32C2
AT 版本号:
AT version:2.5.0.0-dev(bcd5fe3 - ESP32C2 - Oct 19 2022 07:07:53)
SDK version:v5.0-beta1-764-gdbcf640261-dirt
compile time(07ac04f):Nov 25 2022 14:21:44
Bin version:2.5.0(ESP32C2-2MB)
一、问题描述:
最近在使用 AT+CIPRECVDATA=0,3000这条指令去获取被动接收模式下的数据,发现会有概率性返回 error, log 信息如下图所示:
二、测试步骤:
AT+CWMODE=1
OK
AT+CWJAP="espressif",""
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIPMUX=1
OK
AT+CIPRECVMODE=1
OK
AT+CIPSTART=0,"TCP","121.201.33.121",8081
0,CONNECT
OK
AT+CIPSEND=0,213
OK
//实际 post 的data:
GET http://121.201.33.121:8081/app/HM600S/00001300521/V3.10.02_52_AJH_DF0102_E02AA889.jhlbin HTTP/1.1
Host: 121.201.33.121:8081
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8
Range: bytes=0-1
Recv 213 bytes
SEND OK
+IPD,0,295
+CIPRECVLEN:295,0,0,0,0
OK
+CIPRECVDATA:295,HTTP/1.1 206 Partial Content
Server: nginx
Date: Fri, 06 Jan 2023 10:10:52 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2
Last-Modified: Fri, 06 Jan 2023 08:50:47 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "63b7e0e7-74610"
Content-Range: bytes 0-1/476688
OK
AT+CIPRECVLEN?
+CIPRECVLEN:3000,0,0,0,0
OK
AT+CIPRECVDATA=0,3000
ERROR
三、问题分析
先来看下这条指令是用来做什么的, 文档中对于这条指令的定义如下:
所以这条指令要执行成功,需要满足以下条件:
1) 需要保证模式是处于被动模式
2)被动接收模式下查询到的套接字长度不为 0
3)被动接收模式下, 数据内存分配是 ok 的
根据以上三点, 可以从以上三点进行排查:
1)使用 AT+CIPRECVMODE? 指令获取当前是否处于被动模式
2)使用 AT+CIPRECVLEN? 指令获取当前数据的长度
3)可以在 uart0 端查询下是否有 alloc fail 的 log 信息
经排查, 发现是内存分配失败导致的, 对应的 log 信息如下:
四、问题总结
原因: 内存不足导致 AT+CIPRECVDATA=0,3000 返回 ERROR
建议: 1) 关掉不用的 AT 指令, 这部分可以根据具体需求在 menuconfig 中自行调整, idf.py menuconfig--->Component config--->AT
2) 减少 tcp send buffer 和 recv buffer 的大小, idf.py menuconfig-->Component config-->LWIP--->TCP