1

我面临一个问题,无法解决在 nvs 中存储结构数组。

我有这个由可变长度字符串组成的结构:

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,但我在保存这个结构数组时遇到了困难。

有人可以开车送我到正确的方向或有建议吗?

4

1 回答 1

3

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 库的示例。

于 2020-01-08T14:54:53.543 回答