В 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 в выводе.
@Noisemaker, 👍0
Обсуждение2 ответа
Лучший ответ:
Вы можете прочитать эмулированный EEPROM только между началом
и концом
. Он работает с изображением памяти.
begin
выделяет образ в памяти.фиксация
записывает его во флэш-память.завершите
фиксацию и удалите образ памяти.
Вот пример кода 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);
}
- Как читать и записывать EEPROM в ESP8266
- Spiffs против Eeprom на esp8266
- Значение неинициализированной EEPROM в ESP8266
- Wemos D1 EEProm put/get не получает правильное значение
- Нужна помощь с EEPROM, не сохраняющим значения массива на ESP8266 после перезапуска
- Где хранить критические данные в ситуации отключения электроэнергии на ESP8266
- esp8266 esp01s EEPROM и перепрошивка
- Почему мой массив char пуст
почему бы просто не использовать СПАЙФФЫ? он намного проще, намного больше и лучше организован., @dandavis
@dandavis Мне нужно всего лишь сохранить несколько байтов, использование файловой системы кажется слишком "дорогим" для достижения этой простой задачи., @Noisemaker
Это не так дорого, и на самом деле он имеет выравнивание износа, что (потенциально) является огромным долгосрочным преимуществом надежности, особенно когда большинство ваших блоков будут пусты. На самом деле это не полная файловая система, там даже нет путей (только имена), так что это скорее быстрое хранилище ключей и значений. Я бы попробовал и посмотрел, не увязнет ли он в вашем проекте; Я не могу представить, что это будет намного хуже, чем EEPROM, если вы не сделаете что-то, что тоже изнашивается..., @dandavis
вы можете
читать
только междуначалом
иконцом
. он работает с образом памяти.begin
выделяет образ в памяти.commit " записывает его во flash.
конец` фиксирует и удаляет образ памяти, @Juraj@Juraj большое спасибо! Для меня это лучший ответ. Это работает, и теперь я понимаю причину. Кстати, эта процедура не очень хорошо документирована., @Noisemaker