В ESP8266 EEPROM сохраненные данные отличаются, когда я пытаюсь их прочитать

Я работаю над проектом, который требует сохранения некоторых данных в EEPROM. Как я читал в Интернете, у ESP8266 нет реального EEPROM, он использует раздел FLASH сразу после прошивки. Из-за этого чтение/запись сильно отличается от стандартного Arduino, вам нужно вызвать EEPROM.commit(). Вы также должны вызвать EEPROM.begin(размер) (я использовал размер = 512), прежде чем начать его использовать.

Я следую различным учебным пособиям в Интернете и провел несколько тестов, но, похоже, это совсем не работает. Когда я пытаюсь сохранить значение, а затем прочитать его, значения меняются. Я пытался с

EEPROM.write(..)
...
EEPROM.read(..)

и с

EEPROM.put(..)
...
EEPROM.get(..)

но ничего не изменилось.

Есть ли какая-либо конфигурация на плате, которую мне нужно установить в конфигурацию Arduino IDE/платы?

ИЗМЕНИТЬ: вот код

void setup() 
{
    Serial.begin(9600);
    Serial.println();

    EEPROM.begin(512);
    EEPROM.write(0, 62);
    EEPROM.write(10, 103);
    //EEPROM.commit();
    EEPROM.end();
    Serial.print("Read at 0:"); Serial.println(EEPROM.read(0), DEC);
    Serial.print("Read at 10:"); Serial.println(EEPROM.read(10), DEC);
}

Я всегда читаю 0 в выводе.

, 👍0

Обсуждение

почему бы просто не использовать СПАЙФФЫ? он намного проще, намного больше и лучше организован., @dandavis

@dandavis Мне нужно всего лишь сохранить несколько байтов, использование файловой системы кажется слишком "дорогим" для достижения этой простой задачи., @Noisemaker

Это не так дорого, и на самом деле он имеет выравнивание износа, что (потенциально) является огромным долгосрочным преимуществом надежности, особенно когда большинство ваших блоков будут пусты. На самом деле это не полная файловая система, там даже нет путей (только имена), так что это скорее быстрое хранилище ключей и значений. Я бы попробовал и посмотрел, не увязнет ли он в вашем проекте; Я не могу представить, что это будет намного хуже, чем EEPROM, если вы не сделаете что-то, что тоже изнашивается..., @dandavis

вы можете читать только между началом и концом. он работает с образом памяти. begin выделяет образ в памяти. commit " записывает его во flash. конец` фиксирует и удаляет образ памяти, @Juraj

@Juraj большое спасибо! Для меня это лучший ответ. Это работает, и теперь я понимаю причину. Кстати, эта процедура не очень хорошо документирована., @Noisemaker


2 ответа


Лучший ответ:

2

Вы можете прочитать эмулированный EEPROM только между началом и концом. Он работает с изображением памяти.

  • begin выделяет образ в памяти.
  • фиксация записывает его во флэш-память.
  • завершите фиксацию и удалите образ памяти.
,

-1

Вот пример кода ESP8266 для хранения и чтения строк из данных EEPROM:

#include <EEPROM.h>

void writeString(char add,String data);
String read_String(char add);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  EEPROM.begin(512);  // Note::

  String data = "Hello World";

  Serial.print("Writing Data:");
  Serial.println(data);

  writeString(10, data);  //Address 10 and String type data
  delay(10);
}

void loop() {
  // put your main code here, to run repeatedly:
  String recivedData;
  recivedData = read_String(10);
  Serial.print("Read Data:");
  Serial.println(recivedData);
  delay(1000);
}

void writeString(char add,String data)
{
  int _size = data.length();
  int i;
  for(i=0;i<_size;i++)
  {
    EEPROM.write(add+i,data[i]);
  }
  EEPROM.write(add+_size,'\0');   //Add termination null character for String Data
}

String read_String(char add)
{
  int i;
  char data[100]; //Max 100 Bytes
  int len=0;
  unsigned char k;
  k=EEPROM.read(add);
  while(k != '\0' && len<500)   //Read until null character
  {    
    k=EEPROM.read(add+len);
    data[len]=k;
    len++;
  }
  data[len]='\0';
  return String(data);
}
,