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

Arduino ESP8266 EEPROM commit()返回false,无法保存SSID和密码

问题分析与修复方案

首先,导致EEPROM.commit()返回false最核心的问题是**EEPROM.begin(0)的参数错误**:

EEPROM.begin(size)函数需要传入你要使用的EEPROM总字节数,传入0的话,Arduino的EEPROM库不会初始化任何存储空间——后续的写入操作根本没有实际内存区域可以提交,所以commit必然失败。

接下来一步步修复你的代码:

1. 修正EEPROM初始化的大小

根据WiFi SSID(最长32字节)和密码(最长64字节)的标准上限,加上你需要存储的标志位(0xAA)、SSID长度、密码长度这3个额外字节,建议至少分配128字节的空间(留足冗余避免越界)。把初始化代码改成:

EEPROM.begin(128);

2. 修正地址计算错误

你的地址偏移逻辑存在错误,会导致存储空间浪费,极端情况下还可能触发越界问题:

  • 写完SSID后,下一个存储密码长度的地址应该是2 + ssidLength,而不是adress += ssidLength + 1(多加了1,空出了一个无用字节)。
  • 存储密码时,起始地址应该是密码长度的地址+1,这个部分可以通过更清晰的地址变量来避免混乱。

修正后的writePROM()函数:

void writePROM() {
  // 初始化128字节的EEPROM空间
  EEPROM.begin(128);
  // 写入标志位,用于后续验证是否有有效数据
  EEPROM.write(0, 0xAA);
  
  byte ssidLength = ssid.length();
  byte passLength = pass.length();
  
  // 存储SSID长度到地址1
  EEPROM.write(1, ssidLength);
  // 存储SSID到地址2开始的区域
  for(int i = 0; i < ssidLength; i++) {
    EEPROM.write(2 + i, (byte)ssid[i]);
  }
  
  // 计算密码长度的存储地址:2 + SSID长度
  int passLenAddr = 2 + ssidLength;
  EEPROM.write(passLenAddr, passLength);
  // 存储密码到密码长度地址+1的位置
  for(int i = 0; i < passLength; i++) {
    EEPROM.write(passLenAddr + 1 + i, pass[i]);
  }
  
  bool bRc = EEPROM.commit();
  if(bRc) {
    Serial.println("Write successfully");
  } else {
    Serial.println("Write error");
  }
  Serial.println("Write name to EEPROM = " + ssid);
  Serial.println("Write password to EEPROM = " + pass);
}

3. 额外验证建议

为了确保数据写入正确,你可以在写完后添加一段读取代码,验证存储内容和写入的是否一致,比如:

// 验证函数示例
void readPROM() {
  EEPROM.begin(128);
  if(EEPROM.read(0) != 0xAA) {
    Serial.println("No valid data in EEPROM");
    return;
  }
  
  byte ssidLen = EEPROM.read(1);
  String storedSSID = "";
  for(int i=0; i<ssidLen; i++){
    storedSSID += (char)EEPROM.read(2+i);
  }
  
  int passLenAddr = 2 + ssidLen;
  byte passLen = EEPROM.read(passLenAddr);
  String storedPass = "";
  for(int i=0; i<passLen; i++){
    storedPass += (char)EEPROM.read(passLenAddr+1+i);
  }
  
  Serial.println("Stored SSID: " + storedSSID);
  Serial.println("Stored Password: " + storedPass);
}

其他注意事项

  • 确保你的Arduino板支持EEPROM操作(大部分WiFi板比如ESP8266/ESP32都支持,但要确认库的兼容性)。
  • 避免频繁写入EEPROM,因为EEPROM有写入寿命限制(通常几万次)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:37:35