完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用ESP8266 freertos sdk。esptool.py v2.4.0。我使用AP模式和HTTP服务器访问网页。但是,该网页只能在 5 个周期后访问。似乎某些套接字未正确关闭并导致httprx_tx错误。下面我描述一下我的周期。
1- Init AP mode & create webpage 2-与PC连接 3-提交按钮 4- Deinit AP mode & delete webpage 5- 转到步骤 1 下面是我的代码 法典:全选 //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- uint8_t Wifi_Initialize_Process(无效) { uint8_t ret = INITIALIZE_PROCESS; if(Wifi.wIsChanged == WIFI_TO_AP) { Tcount_WifiAP = Wifi_AP_Interval; Wifi.wMode = WIFI_MODEAP; Wifi.wStatus = WIFI_APCONFIG; Wifi.wIsChanged = WIFI_NO_CHANGE; Initialise_wifi(); Wifi_Start_Ap(); #ifdef WIFI_USE_WEBPAGE Wifi_Server_Create(); #endif } else { Wifi.wMode = WIFI_MODENONE; Wifi.wStatus = WIFI_READY; Wifi.wIsChanged = WIFI_NO_CHANGE; Initialise_wifi(); } ret = BACKGROUND_PROCESS; #ifdef _DEBUG_ _DEBUG_("Wifi: INITIALIZE_PROCESS ok"); #endif return ret; } //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- void Initialise_wifi(void) { if(Wifi.wMode > WIFI_MODENONE) { esp_err_t err; tcpip_adapter_init(); err = tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: tcpip_adapter_dhcps_stop() : %s", esp_err_to_name(err)); #endif } tcpip_adapter_ip_info_t ip_info; IP4_ADDR(&ip_info.ip, Esp_Param.Ap_IP[0], Esp_Param.Ap_IP[1], Esp_Param.Ap_IP[2], Esp_Param.Ap_IP[3]); IP4_ADDR(&ip_info.gw, Esp_Param.Ap_IP[0], Esp_Param.Ap_IP[1], Esp_Param.Ap_IP[2], Esp_Param.Ap_IP[3]); IP4_ADDR(&ip_info.netmask, 255, 255, 255, 0); #ifdef _DEBUG_ _DEBUG_("Wifi: ip_info.ip = " IPSTR, IP2STR(&ip_info.ip)); #endif err = tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &ip_info); //set static IP if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: tcpip_adapter_set_ip_info() : %s", esp_err_to_name(err)); #endif } err = tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: tcpip_adapter_dhcps_start() : %s", esp_err_to_name(err)); #endif } err = esp_event_loop_create_default(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_loop_create_default() : %s", esp_err_to_name(err)); #endif } wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); err = esp_wifi_init(&cfg); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_init() : %s", esp_err_to_name(err)); #endif } err = esp_wifi_set_storage(WIFI_STORAGE_RAM); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_set_storage() : %s", esp_err_to_name(err)); #endif } err = esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_handler_register() : %s", esp_err_to_name(err)); #endif } err = esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_handler_register() : %s", esp_err_to_name(err)); #endif } } } //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- void DeInitialize_Wifi(void) { if(Wifi.wMode > WIFI_MODENONE) { esp_err_t err; #ifdef WIFI_USE_WEBPAGE Wifi_Server_Delete(); #endif err = esp_event_handler_unregister(ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, &event_handler); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_handler_unregister() : %s", esp_err_to_name(err)); #endif } if(Wifi.wConnection == STA_CONNECTED) { err = esp_wifi_disconnect(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_disconnect() : %s", esp_err_to_name(err)); #endif } } err = esp_wifi_stop(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_stop() : %s", esp_err_to_name(err)); #endif } err = esp_wifi_deinit(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_deinit() : %s", esp_err_to_name(err)); #endif } #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_stop() & esp_wifi_deinit()"); #endif err = esp_event_loop_delete_default(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_loop_delete_default() : %s", esp_err_to_name(err)); #endif } #ifdef _DEBUG_ _DEBUG_("Wifi: esp_event_handler_unregister() & esp_event_loop_delete_default()"); #endif } } //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- 无效 Wifi_Start_Ap() { esp_err_t err; wifi_config_t wifi_config = {0}; memset(&wifi_config, 0 , sizeof(wifi_config)); wifi_config.ap.max_connection = 1; wifi_config.ap.authmode = WIFI_AUTH_WPA2_PSK; sprintf((char*)wifi_config.ap.ssid, Esp_Param.AP_Ssid); sprintf((char*)wifi_config.ap.password, Esp_Param.AP_Pass); err = esp_wifi_set_mode(WIFI_MODE_AP); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_set_mode() : %s", esp_err_to_name(err)); #endif } err = esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_set_config() : %s", esp_err_to_name(err)); #endif } err = esp_wifi_start(); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: esp_wifi_start() : %s", esp_err_to_name(err)); #endif } } //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- void Wifi_Server_Create(void) { if(server == 0) { httpd_config_t config = HTTPD_DEFAULT_CONFIG(); config.stack_size = Http_SERVER_Config_Stack_Size; config.lru_purge_enable = true; #ifdef _DEBUG_ _DEBUG_("HttpServer: Starting server"); #endif if(httpd_start(&server, &config) != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("HttpServer: COULD NOT START SERVER"); #endif } if(uri_handler_inited == 0) { uri_handler_inited = 1; httpd_uri_t first_end_point_config = { .uri = "/", .method = HTTP_GET, .handler = on_url_hit}; httpd_register_uri_handler(server,&first_end_point_config); httpd_uri_t setwifi_end_point_config = { .uri = "/api/setwifi", .method = HTTP_POST, .handler = on_setwifi_set}; httpd_register_uri_handler(server,&setwifi_end_point_config); } } } //------------------------------------------------------------------------------------- 功能: 描述: //------------------------------------------------------------------------------------- void Wifi_Server_Delete(void) { if(server != 0) { #ifdef _DEBUG_ _DEBUG_("HttpServer: Delete server"); #endif esp_err_t err; if(uri_handler_inited == 1) { uri_handler_inited = 0; httpd_unregister_uri_handler(server, "/", HTTP_GET); httpd_unregister_uri_handler(server, "/api/setwifi", HTTP_POST); } err = httpd_stop(server); if(err != ESP_OK) { #ifdef _DEBUG_ _DEBUG_("Wifi: httpd_stop() : %s", esp_err_to_name(err)); #endif } server = 0; } } 下面是ESP日志中打印的httpd错误 (11:37:50.392) W (197233) httpd_txrx: httpd_sock_err: error in send : 0 以下是完整的调试日志 (11:37:25.758) I (170692) Main: Exit config |
|
相关推荐
1个回答
|
|
以下是一些建议和可能的解决方案:
1. 确保在每个周期结束时正确释放资源:在您的代码中,确保在每个周期结束时释放所有分配的内存、关闭所有打开的套接字和文件等。这可以通过在每个周期结束时调用相应的释放函数来实现。 2. 检查HTTP服务器的实现:确保您的HTTP服务器能够正确处理并发连接和请求。如果可能的话,使用现有的HTTP服务器库,如ESP8266WebServer或ESPAsyncWebServer,这些库已经处理了许多常见的问题。 3. 优化周期性操作:在您的代码中,尝试优化周期性操作,避免在每个周期结束时重复初始化和销毁资源。例如,您可以将AP模式和HTTP服务器的初始化放在程序的开始处,然后在每个周期结束时只执行必要的清理工作。 4. 使用任务监控和调试:在您的代码中添加任务监控和调试信息,以便更好地了解程序在运行过程中的状态。这可以帮助您找到可能导致问题的原因。 5. 检查ESP8266的内存使用情况:ESP8266的内存有限,如果程序在运行过程中不断消耗内存,可能会导致问题。使用xPortGetFreeHeapSize()函数检查内存使用情况,并确保在每个周期结束时释放不再使用的内存。 6. 更新ESP8266 RTOS SDK和esptool.py:确保您使用的是最新版本的ESP8266 RTOS SDK和esptool.py,因为新版本可能修复了一些已知的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
142 浏览 1 评论
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
438浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:11 , Processed in 0.874720 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号