You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_*,事件回调不触发会导致你看不到完整的连接错误日志,难以排查问题。

修复方案

直接替换对应位置的代码即可:

  1. 替换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");
  }
}
  1. 在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());
    }
  }
}
  1. 把WiFi事件回调里的所有SYSTEM_EVENT_前缀替换成ARDUINO_EVENT_,适配新版ESP32核心,方便查看完整连接日志定位问题。
  2. 可选优化:去掉/connectAP路由里的delay(2000),AsyncWebServer是异步框架,send()调用后不需要手动等待,直接执行ESP.restart()即可,多余的delay反而会阻塞异步响应的发送。

验证要点

烧录修改后的固件后,打开串口监视器选择115200波特率查看日志:

  • 确认打印的读取到的SSID和实际设置的完全一致,没有多余字符
  • 连接过程中会逐行打印.代表等待连接,成功后会输出STA获取到的IP地址
  • 软AP会持续保持可用,不影响你通过192.168.4.1访问设备配置页面

内容的提问来源于stack exchange,提问作者Clusterzx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:01:11