乐鑫技术交流
直播中

duke刘

11年用户 840经验值
擅长:可编程逻辑
私信 关注
[问答]

esp8266向http server发送post请求,发送一段时间之后会返回ESPCONN_MEM,为什么?

我用ESP8266做client向HTTP sever发送post请求,发送一段时间之后,调用espconn_send就会返回ESPCONN_MEM,我是等上一包数据发完之后,进入了sent callback,然后再发下一包,我不知道tcp_PCB是在哪儿close和删除的,我尝试在disconnect callback和reconnect callback中调用espconn_delete或espconn_disconnect,都不行,不知道问题出在哪儿.
void ICACHE_FLASH_ATTR disconnect_callback(void *arg)
{
        struct espconn *conn = (struct espconn *)arg;
        sint8 error = espconn_delete(conn);
        //sint8 error = espconn_disconnect(conn);
        if(conn == NULL)
           return;
        if(conn->proto.tcp != NULL) {
                os_free(conn->proto.tcp);
                conn->proto.tcp = NULL;
        }
        os_free(conn);
        user_conn = NULL;
        if(error != 0){
                char str[30];
                os_sprintf(str, " delete err: %d", error);
                uart0_sendStr(str);
        }
}
         

回帖(1)

李芳

2024-7-10 17:56:27
ESP8266在发送HTTP POST请求时,出现ESPCONN_MEM错误的原因可能有以下几点:

1. 内存不足:ESP8266的内存有限,如果在发送大量数据或者频繁发送数据时,可能会导致内存不足。此时,可以尝试优化代码,减少内存占用,或者增加数据发送的间隔时间。

2. 连接超时:如果ESP8266与HTTP服务器之间的连接超时,也可能导致ESPCONN_MEM错误。可以尝试调整连接超时时间,或者检查网络连接是否稳定。

3. 连接未正确关闭:在使用ESP8266作为TCP客户端时,需要确保在数据发送完成后正确关闭连接。可以在sent callback中调用espconn_disconnect()来关闭连接。同时,需要在disconnect callback中释放相关资源。

4. 重连机制:如果在disconnect callback中尝试调用espconn_reconnect()进行重连,可能会导致TCP连接状态混乱。建议在reconnect callback中处理重连逻辑。

针对你的问题,可以尝试以下解决方案:

1. 确保在sent callback中调用espconn_disconnect()来关闭连接。

```c
void ICACHE_FLASH_ATTR sent_callback(void *arg) {
    struct espconn *conn = (struct espconn *)arg;
    espconn_disconnect(conn);
}
```

2. 在disconnect callback中释放相关资源,并确保连接已经关闭。

```c
void ICACHE_FLASH_ATTR disconnect_callback(void *arg) {
    struct espconn *conn = (struct espconn *)arg;
    espconn_abort(conn); // 释放连接资源
}
```

3. 如果需要重连,可以在reconnect callback中处理重连逻辑。

```c
void ICACHE_FLASH_ATTR reconnect_callback(void *arg, sint8 err) {
    struct espconn *conn = (struct espconn *)arg;
    if (err == 0) {
        // 重连成功,可以重新发送数据
    } else {
        // 重连失败,可以进行错误处理或者尝试重新连接
    }
}
```

4. 检查网络连接是否稳定,以及连接超时时间是否合适。

5. 优化代码,减少内存占用,或者增加数据发送的间隔时间。

通过以上方法,应该可以解决ESP8266发送POST请求时出现的ESPCONN_MEM错误。如果问题仍然存在,请检查代码逻辑,确保TCP连接的建立、发送、关闭等操作都按照正确的顺序执行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分