Arduino esp32: хранение массива структуры EEPROM - PullRequest
1 голос
/ 08 января 2020

Я столкнулся с проблемой, которую не удалось решить, чтобы сохранить массив struct в nvs.

У меня есть эта структура, состоящая из переменной длины String:

typedef struct
 {
     String Name;
     String Surname;
     String Status;
     String Expiry;
 }  EpromTags;

EpromTags arraytag[50];

void setup()
{
  //should load arraytag from EEPROM here
 } 

В других подпрограммах у меня есть эти данные, поступающие с удаленного сервера, поэтому я сохраняю их для меня arraytag


for (int i=0, i<50,i++)
 {
    arraytag[i].Name = valuename[i];
    arraytag[i].Surname = valuesurname[i];
    arraytag[i].Status = valuestatus[i];
    arraytag[i].Expiry = valueexp[i];
 }  

//should save to arraytag to EEPROM here

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

Мне удалось записать отдельные элементы в EEPROM, но я испытываю трудности при сохранении этого массива структуры.

Может кто-нибудь направить меня в правильном направлении или есть предложения?

1 Ответ

2 голосов
/ 08 января 2020

Класс String обрабатывает буфер массива символов, выделенный в памяти кучи. Объект класса String имеет только указатель на этот буфер. Если вы сохраняете объект String в EEPROM, вы не сохраняете буфер, и после извлечения объекта указатель недействителен.

Используйте C строки (массивы символов с нулем в конце) предопределенного размера для хранения структура со строкой в ​​EEPROM.

typedef struct
 {
     char name[NAME_MAX_LENGTH];
     char surname[SURENAME_MAX_LENGTH];
     char status[STATUS_LENGTH];
     char expiry[EXP_LENGTH];
 }  EpromTags;

Для сохранения любого типа данных вы можете использовать EEPROM.put (). Чтобы прочитать его обратно, вы используете EEPROM.get (). Таким образом, вы можете использовать прямое EEPROM.put(arraytag) для хранения всех 50 элементов массива и EEPROM.get(arraytag) для его считывания.

Размер структуры sizeof(EpromTags). Размер массива - это количество элементов, умноженное на размер элемента.

Обратите внимание, что библиотека ESPROM ESP32 эмулирует EEPROM в памяти fla sh и требует вызова EEPROM.begin() и EEPROM.commit(). См. Примеры библиотеки ESP32 EEPROM по ее использованию.

...