Arduino ESP8266 EEPROM commit() returns 错误

Arduino ESP8266 EEPROM commit() returns false

我想将 SSID 和密码保存在我的 Arduino Sketch Wlan 的 EEPROM 中。

实际上到目前为止一切正常,除了提交 () returns 是错误的。这就是为什么重启后内存又是空的。

我的代码:

void writePROM()
{
  EEPROM.begin(0);
  EEPROM.write(0, 0xAA);

  byte ssidLength = ssid.length();
  byte passLength = pass.length();

  int adress = 2;
  EEPROM.write(1, (byte)ssidLength);
  for(int i = 0; i < ssidLength; i++)
  {
    EEPROM.write(adress + i, (byte)ssid[i]);
  }
  adress += ssidLength + 1;

  EEPROM.write(adress++, passLength);
  for(int i = 0; i < passLength; i++)
  {
    EEPROM.write(adress + 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);
}

我做错了什么?

首先,感谢您检查 commit() 调用的结果。

您在初始化 EEPROM 库时传递了 0:

  EEPROM.begin(0);

您需要将要使用它存储的字节数传递给它。

您可以阅读 code for the EEPROM library 来确认这一点:

void EEPROMClass::begin(size_t size) {
  if (size <= 0) {
    DEBUGV("EEPROMClass::begin error, size == 0\n");
    return;
  }

如果您传递 0,它只是 returns 而无需进行任何设置。您还可以看到 commit() will do nothing 在这种情况下:

bool EEPROMClass::commit() {
  if (!_size)
    return false;

在您的情况下,您应该调用 EEPROM.begin() 至少使用 SSID 和密码的最大大小加上零终止字节各一个(因此,SSID 为 32 个字符,密码为 63 个字符,加上2 代表 97).

但是,正如@Juraj 在评论中指出的那样,您无需执行任何操作,因为 ESP8266 会自动保存 Wifi 凭据。