我有一些代码可以将配置数据存储到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
答案 0 :(得分:3)
ESP32没有EEPROM。这只是对闪存的仿真。您需要提交更改以将其从RAM移至闪存。
在写入之前添加适当大小的EEPROM.begin(EEPROM_SIZE)
,以初始化EEPROM仿真。
在写入后添加EEPROM.commit()
,以将写入内容提交到闪存。
请注意,不建议使用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);
}
}