指向结构变量的指针未保存到 eeprom

pointer to struct variable not saving to eeprom

我有一些代码可以将配置数据存储到 EEPROM。变量配置中的数据可以打印到串行控制台,但不能保存到 EEPROM。我正在使用 ESP32(Arduino 框架)。下面的代码是 link.

中代码的简化版本
#include <Arduino.h>
#include <EEPROM.h>

#define config_ver "VER01"

typedef struct {
  char version[10];
  int settings;
} configuration_type;

configuration_type configuration = {config_ver,50};

void saveconfig() {
  Serial.println("Saving configuration!!");
  for(int i=0; i < sizeof(configuration); i++) {
    char data = *((char*)&configuration + i);
    Serial.print(data);              //<----- Prints fine
    EEPROM.write(i,data);            //<----- Problem!!
  }
   Serial.println();
}

void setup() {
  Serial.begin(115200);
  saveconfig();

  Serial.println("Fetching EEPROM..!");
  for(int i = 0; i <= 20; i++) {
    Serial.print(EEPROM.read(i));
  }
  Serial.println("\n");
}

void loop() {

}

输出:

Saving configuration!!
VER01␀␀␀␀␀␀␀2␀␀␀        <--- prints fine!!
Fetching EEPROM..!
000000000000000000000           <--- Not saving to eeprom

运算符优先级有时会出现问题。我没有深入研究这里的优先级,但提出以下建议以防止出现任何问题:

void saveconfig() {
  Serial.println("Saving configuration!!");
  unsigned char *data = (unsigned char *)&configuration;
  for(int i=0; i < sizeof(configuration); i++, data++) {
    EEPROM.write(i,*data);
  }
}

ESP32没有EEPROM。这只是闪存中的仿真。您需要提交更改以将它们从 RAM 移动到闪存。

在您写入初始化 EEPROM 仿真之前,添加具有适当大小的 EEPROM.begin(EEPROM_SIZE)

在写入后添加 EEPROM.commit() 以将写入提交到闪存。

参考官方例子: https://github.com/espressif/arduino-esp32/blob/master/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino

请注意,EEPROM 已弃用。请改用首选项库。

https://github.com/espressif/arduino-esp32/tree/master/libraries/EEPROM