ESP8266 EEPROM READ / WRITE - Кажется, что запись происходит до чтения старого значения - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь написать код для ESP8266-12E, который определяет начальную загрузку программы новой версии кода. Для этой упрощенной версии моего кода (которая все еще демонстрирует поведение, которое я наблюдаю) в разделе l oop () нет кода.

Я помещаю свою текущую версию кода в const String pgmVersion. Код читает EEPROM (фактически fla sh для ESP8266) и сравнивает его с текущей версией кода (pgmVersion). Если они разные, то я знаю, что у меня новая версия кода. Затем следует запись в EEPROM для сохранения текущей версии pgmVersion, чтобы при следующей загрузке эта версия была старой.

Когда я запускаю код только с l oop для прочитав eeprom, я вижу, что сохраненная версия отличается от текущей (а также могу видеть, когда они совпадают). Кажется, это работает правильно.

Однако, когда я запускаю полный код, который включает запись в eeprom, чтение l oop всегда указывает, что сохраненная версия соответствует текущей версии и не выполняет eeprom напишите для l oop. Это происходит постоянно, даже когда я запускаю с новым значением для текущей версии. Меня это просто сбивает с толку. Я могу отключить питание, а затем снова включить его, и данные новой версии были сохранены в eeprom, так что кажется, что она действительно записывается.

Может ли кто-нибудь увидеть, что не так с моим кодом, или объяснить, почему кажется, что eeprom быть написанным без прохождения моего eeprom напишите для l oop? Я прочитал много сообщений и онлайн-документации и до сих пор не могу понять этого.

Джим

#include <EEPROM.h>
const String pgmVersion = "00.04";
void setup() {
  Serial.begin(115200);
  EEPROM.begin(6);
  delay(500);
  char eepData;
  char pgmData;
  bool pgmMatch = true;
  for (unsigned int i = 0; i < pgmVersion.length(); i++) 
  {
    eepData = char(EEPROM.read(i));
    pgmData = pgmVersion.charAt(i);
    Serial.print("eepData = ");
    Serial.println(eepData);
    Serial.print("pgmVersion[i] = ");
    Serial.println(pgmData);
    
    if (eepData == pgmData)
    {
      Serial.println("eepData matches pgmData at index " + String(i));
    } else
    {
      Serial.println("eepData does NOT match pgmData at index " + String(i));
      pgmMatch = false;
    }
  }
    if (!pgmMatch)
    {
      Serial.println("Writing EEPROM");
      for (unsigned int i = 0; i < pgmVersion.length(); i++) 
      {
        pgmData = pgmVersion.charAt(i);
        EEPROM.write(i,pgmData);
        delay(10);
      }
      if (EEPROM.commit()) 
      {
        Serial.println("EEPROM successfully committed");
      } else 
      {
        Serial.println("ERROR! EEPROM commit failed");
      }
    }
}

void loop() {
  // put your main code here, to run repeatedly:
}

1 Ответ

0 голосов
/ 04 августа 2020

Хорошо, я выяснил, что происходит. Приведенный выше код не работает правильно, как описано в исходном сообщении, при работе под VS Code с PlatformIO. Но работает как надо при работе под Arduino IDE. (Я изначально не публиковал #include это необходимо в этой среде - моя ошибка!).

При запуске кода с включенной записью l oop, похоже, что запись eeprom выполняется до самой записи l oop, как когда сохраненные данные pgm и новые данные pgm, как известно, различаются, код сравнения говорит, что они одинаковы.

Я попытался просто закомментировать строку с записью eeprom для случая, когда сохраненные данные pgm и новые данные pgm как известно, разные. Это привело к тому, что запись l oop была введена должным образом (это означает, что код обнаружил, что сохраненные и новые данные pgm не совпадают).

Таким образом, похоже, что версия VS Code с PlatformIO переупорядочивает код, подняв EEPROM написать где-нибудь или что-то с этим эффектом. Если это действительно так, то необходимо исправить какой-то фрагмент кода платформы или какую-то барьерную инструкцию, чтобы этого не произошло. Это прискорбно, поскольку я ценю дополнительные функции, доступные в среде VS Code / PlatformIO.

...