>我遇到了一个问题,无法解决在 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,但是我发现保存此结构数组时遇到困难。
有人可以带我朝着正确的方向前进或提出建议吗?
字符串类处理在堆内存中分配的字符数组缓冲区。类 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 库的示例,了解如何使用它。