Arduino ESP8266 EEPROM commit () возвращает false

Я хочу сохранить SSID и пароль в EEPROM в моем Arduino Sketch Wlan.

На самом деле пока все работает, за исключением того, что 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);
}

Что я делаю не так?


person Sadece Sadece    schedule 09.10.2020    source источник
comment
Что я делаю не так? Использование библиотеки низкого качества, которая возвращает только истину или ложь в качестве информации об ошибке. Может быть что угодно: неправильная частота прескалера, активная защита памяти, рассогласование, тайм-аут ... выполните код с помощью отладчика, если у вас есть источник этой плохой библиотеки, войдите в их функции и посмотрите, где они ошибаются.   -  person Lundin    schedule 09.10.2020
comment
esp8266 сохраняет эти данные самостоятельно. попробуйте скетч с WiFi.begin (ssid, pass), а затем загрузите тот же скетч с WiFi.begin () без параметров. он подключится к запомненной сети. вот простой пример ConfigurationAP, в котором используется этот github.com/jandrassy/lab / blob / master / ConfigurationAP /   -  person Juraj    schedule 09.10.2020


Ответы (1)


Прежде всего, хорошо, что вы проверили результат вызова commit().

Вы передаете 0 при инициализации библиотеки EEPROM:

  EEPROM.begin(0);

Вам нужно передать ему количество байтов, которое вы хотите сохранить, используя его.

Вы можете прочитать код для библиотеки EEPROM чтобы подтвердить это:

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

Если вы передадите 0, он просто вернется без каких-либо настроек. Вы также можете видеть, что commit() ничего не сделает в этом случае:

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

В вашем случае вы должны вызвать EEPROM.begin() с как минимум максимальным размером SSID и пароля плюс по одному для нулевых завершающих байтов (так, 32 символа для SSID, 63 для пароля, плюс 2 для 97).

Но, как отметил @Juraj в комментариях, вам не нужно ничего делать, поскольку ESP8266 автоматически сохранит учетные данные Wifi.

person romkey    schedule 09.10.2020