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

时间:2019-11-12 09:07:19

标签: c++ arduino esp32

我有一些代码可以将配置数据存储到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

2 个答案:

答案 0 :(得分:3)

ESP32没有EEPROM。这只是对闪存的仿真。您需要提交更改以将其从RAM移至闪存。

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

在写入后添加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

答案 1 :(得分:0)

运算符的优先级有时可能会成问题。我没有在这里优先考虑,但是建议以下内容以防止出现任何问题:

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);
  }
}