ESP32 APSTA模式重启后无法自动连接已配置WiFi的故障求助
ESP32 APSTA模式下WiFi连接失败根因及修复
你的代码存在5个直接导致STA连接失败的问题,逐个对应修复即可:
- 配置字符串带不可见脏字符,且错误删除SSID/密码中的合法空格
你用readString()读文件时,会把文件写入时产生的换行符\n、回车符\r、首尾空白字符全部读入内存,后续的ap_config.replace(' ', NULL)有三个致命错误:一是只替换半角空格,清不掉换行、回车等不可见字符;二是会把SSID、密码中间合法的半角空格直接删掉(比如SSID叫My WiFi 2.4G会被改成MyWiFi2.4G,和实际热点名完全不匹配);三是传入NULL作为替换目标属于未定义行为,容易导致字符串内存异常。 - 读完配置立刻删除配置文件,无重试机会
你读完两个配置文件后立刻执行LittleFS.remove()删除配置,如果第一次连接因为信号弱、路由器响应慢等临时问题失败,下次重启直接检测不到配置文件,根本不会再尝试连接。 - WiFi连接逻辑只执行一次,无等待、无重连
wifiMulti.run()是非阻塞调用,你在setup里只调用一次就往下执行,此时WiFi连接流程还没完成(正常连接需要3-10秒不等),代码根本没有等待连接结果就退出了连接逻辑,自然连不上。 - 单AP场景滥用WiFiMulti
你只存储了一个目标热点,完全没必要引入WiFiMulti库,这个库是为多AP自动择优场景设计的,在APSTA混合模式下兼容性不如原生WiFi.begin()稳定。 - 旧版事件宏兼容性问题
如果你使用3.0及以上版本的ESP32 Arduino核心,代码里的SYSTEM_EVENT_*系列宏已经全部废弃改为ARDUINO_EVENT_*,事件回调不触发会导致你看不到完整的连接错误日志,难以排查问题。
修复方案
直接替换对应位置的代码即可:
- 替换setup中配置读取与WiFi连接的代码块,去掉删文件逻辑,用
trim()清理首尾空白,增加连接等待超时,改用原生WiFi.begin():
// 把原setup里检测配置文件的整个if块替换为以下代码 if (LittleFS.exists("/connect_ap.txt") && LittleFS.exists("/connect_pass.txt")){ Serial.println("AP Settings files exist"); File apfile = LittleFS.open("/connect_ap.txt", "r"); if(!apfile){ Serial.println("Open SSID config file failed"); }else{ ap_config = apfile.readString(); apfile.close(); } File passfile = LittleFS.open("/connect_pass.txt", "r"); if(!passfile){ Serial.println("Open password config file failed"); }else{ pass_config = passfile.readString(); passfile.close(); } // 只清理首尾的空白、换行、回车,不修改字符串中间的合法字符 ap_config.trim(); pass_config.trim(); Serial.printf("Read config, SSID: %s, password length: %d\n", ap_config.c_str(), pass_config.length()); // 启动STA连接 WiFi.begin(ap_config.c_str(), pass_config.c_str()); // 最长等待15秒连接结果 uint8_t connectRetry = 0; while (WiFi.status() != WL_CONNECTED && connectRetry < 30) { delay(500); Serial.print("."); connectRetry++; } if(WiFi.status() == WL_CONNECTED) { Serial.println("\nWiFi connected"); Serial.print("STA IP address: "); Serial.println(WiFi.localIP()); } else { Serial.println("\nWiFi connect failed, will auto retry later"); } }
- 在loop函数中增加断线重连逻辑,保证STA断线后自动重连,不影响软AP正常运行:
void loop(){ // 每30秒检测一次STA连接状态,断线自动重连 static uint32_t lastReconnectCheck = 0; if (millis() - lastReconnectCheck > 30000 && ap_config.length() > 0) { lastReconnectCheck = millis(); if (WiFi.status() != WL_CONNECTED) { Serial.println("STA disconnected, try reconnect..."); WiFi.disconnect(); WiFi.begin(ap_config.c_str(), pass_config.c_str()); } } }
- 把WiFi事件回调里的所有
SYSTEM_EVENT_前缀替换成ARDUINO_EVENT_,适配新版ESP32核心,方便查看完整连接日志定位问题。 - 可选优化:去掉
/connectAP路由里的delay(2000),AsyncWebServer是异步框架,send()调用后不需要手动等待,直接执行ESP.restart()即可,多余的delay反而会阻塞异步响应的发送。
验证要点
烧录修改后的固件后,打开串口监视器选择115200波特率查看日志:
- 确认打印的读取到的SSID和实际设置的完全一致,没有多余字符
- 连接过程中会逐行打印
.代表等待连接,成功后会输出STA获取到的IP地址 - 软AP会持续保持可用,不影响你通过192.168.4.1访问设备配置页面
内容的提问来源于stack exchange,提问作者Clusterzx
相关产品推荐
相关产品推荐

