乐鑫技术交流
直播中

李泽坚

7年用户 1369经验值
私信 关注
[问答]

esp8266作为client向http server发送post请求,发送一段时间就会ESPCONN_MEM怎么解决?

我用esp8266作为client向http server发送post请求,发送10几分钟之后,espconn_send就会返回ESPCONN_MEM错误,上一包数据发送完成,进入sent callback之后我再发下一条post请求.我怀疑是连接的tcp_PCB没有释放掉,可是我不知道该如何释放,我在disconnect 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->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)

elecfans

2024-7-10 17:49:26
ESP8266在发送HTTP POST请求时遇到ESPCONN_MEM错误,通常是由于内存不足导致的。以下是一些建议来解决这个问题:

1. 检查代码中是否有内存泄漏。确保在使用完动态分配的内存后,使用`free()`函数释放内存。

2. 优化数据结构和算法,减少内存使用。例如,使用更小的数据结构或更高效的算法。

3. 在`disconnect_callback`函数中,确保正确地释放连接资源。你可以尝试以下代码:

```c
void ICACHE_FLASH_ATTR disconnect_callback(void *arg) {
    struct espconn *conn = (struct espconn *)arg;

    // 释放连接资源
    espconn_disconnect(conn);
    espconn_delete(conn);

    // 释放与连接相关的其他资源(如果有)
    // ...
}
```

4. 如果问题仍然存在,可以尝试使用更简单的HTTP客户端库,如[ESP8266 HTTP Client](https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient),它可能更有效地管理内存。

5. 如果你仍然遇到ESPCONN_MEM错误,可以尝试升级ESP8266固件到最新版本,以获取可能的内存管理和性能改进。

6. 最后,如果以上方法都无法解决问题,你可以考虑使用具有更大内存的ESP32或其他具有更高性能的微控制器。
举报

更多回帖

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