Arduino ESP8266 EEPROM commit返回false

问题描述

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

实际上,到目前为止,一切都可以正常工作,只是commit()返回false。这就是为什么重新启动后内存再次为空。

我的代码

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,它将直接返回而不进行任何设置。在这种情况下,您还可以看到commit() will do nothing

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

在您的情况下,应至少以最大SSID和密码的最大大小加EEPROM.begin()来致电{ organization(login: "your-org") { repositories(first: 100) { nodes { nameWithOwner collaborators(first: 100) { totalCount edges { permission node { login name } } pageInfo { endCursor hasNextPage } } } } } } ,然后为零终止字节各加一个(因此,SSID为32个字符,密码为63个字符,加2为97)。

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