Arduino esp32: хранение массива struct EEPROM

Я столкнулся с проблемой, которую невозможно решить, чтобы сохранить массив структур в 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, но мне трудно сохранить этот массив структур.

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


person giorgio    schedule 08.01.2020    source источник


Ответы (1)


Класс 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). Размер массива - это количество элементов, умноженное на размер элемента.

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

person Juraj    schedule 08.01.2020