指向结构变量的指针未保存到 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()
以将写入提交到闪存。
请注意,EEPROM 已弃用。请改用首选项库。
见https://github.com/espressif/arduino-esp32/tree/master/libraries/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()
以将写入提交到闪存。
请注意,EEPROM 已弃用。请改用首选项库。
见https://github.com/espressif/arduino-esp32/tree/master/libraries/EEPROM