Проверка, что EEPROM затёрта

Здравствуйте, такой вопрос: Когда загружаем прошивку в ESP8266 и стираем весь Flash из Arduino IDE, EEPROM естественно так же стирается. Вот только не понятно какими символами она записывается, так как при чтении “пустой” EEPROM в Serial, показывает, что там что-то есть.
Вот что показывает Serial:
SSID: ����������
Pass WiFi: ��������

У меня условие проверки EEPROM при включении ESP8266 такое:

  if (!digitalRead(PIN_BUT) || String(portalCfg.ssid) == "") portalRun();   // Если кнопка при Вкл. нажата или структура пустая, то  переходим в  режим AP

Если я делаю сброс настроек из ESP, заполняя его нулями вот так:

EEPROM.begin(120);          // Инициализируем EEPROM
   for (byte rw = 0; rw < 120; rw++) {
      EEPROM.write(rw, 0);  // Подготавливаем к записи нулей с 0 по 120 ячейки (сохраняем в ОЗУ)
      EEPROM.commit();      // Записываем  из ОЗУ в EEPROM
      EEPROM.end();         // И очищаем данные из ОЗУ
}

То условие String(portalCfg.ssid) == “” отрабатывает отлично, а при стирании EEPROM из Arduino IDE так не прокатывает.

Как сделать условие, так что если в EEPROM записан какой то мусор непонятный, как показал выше, то запустить функцию вызывающую переход в режим AP?

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

Писать данные с контрольной суммой. При считывании проверять её. Сходится - переходить к работе, не сходится - поднимать AP.

1 лайк

Не вникал, как в esp8266, а в avr eeprom при затирании забивается не нулями (0х00), а единицами (0xff)

Спасибо за просто совет [b707]. При чтении в int переменная заполнена максимальными значениями, значит в byte EEPROM пишется 255.
И тут же обратил внимание, что после компиляции есть путь с параметрами в окне вывода:
“C:\Users\Otto\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2/tools/upload.py”

Почему то не обращал внимание на неё ранее, посмотрев файлик upload.py, убедился, что пишутся значения 255.
Строчка из файла:

os.write(eraser[0], bytearray([255] * int(erase_len, 0)))

Сделал проще:

  byte Check_EEPROM;
EEPROM.get(0, Check_EEPROM);

if (!digitalRead(PIN_BUT) || String(portalCfg.ssid) == "" || Check_EEPROM == 255) portalRun(PORTAL_TIMEOUT);

Работает как и хотел, спасибо.

1 лайк

А давно в esp8266 появился EEPROM ?

Эмуляция там во flash, как в STM32.