每次尝试运行此link中的代码时,我的程序都会崩溃。问题似乎出在*((char*)&configuration + i) = (char)EEPROM.read(i);
这一行。我认为不需要为变量configuration
分配内存,因为变量configuration
已经初始化。
int loadconfig() {
if(EEPROM.read(0) == config_ver[0] && EEPROM.read(1) == config_ver[1] &&
EEPROM.read(2) == config_ver[2] && EEPROM.read(3) == config_ver[3]) {
for(int i = 0; i <= sizeof(configuration_type); i++) {
*((char*)&configuration + i) = (char)EEPROM.read(i); //<------problem
}
return 1;
}
return 0;
}
链接中的整个代码:
#include <EEPROM.h>
#define CONFIG_VERSION "VER01"
// Where in EEPROM?
#define CONFIG_START 32
typedef struct
{
char version[6]; // detect if setting actually are written
int my_setting_integer;
} configuration_type;
// with DEFAULT values!
configuration_type CONFIGURATION = {
CONFIG_VERSION,
42
};
// load whats in EEPROM in to the local CONFIGURATION if it is a valid setting
int loadConfig() {
// is it correct?
if (EEPROM.read(CONFIG_START + 0) == CONFIG_VERSION[0] &&
EEPROM.read(CONFIG_START + 1) == CONFIG_VERSION[1] &&
EEPROM.read(CONFIG_START + 2) == CONFIG_VERSION[2] &&
EEPROM.read(CONFIG_START + 3) == CONFIG_VERSION[3] &&
EEPROM.read(CONFIG_START + 4) == CONFIG_VERSION[4]){
// load (overwrite) the local configuration struct
for (unsigned int i=0; i<sizeof(CONFIGURATION); i++){
*((char*)&CONFIGURATION + i) = EEPROM.read(CONFIG_START + i);
}
return 1; // return 1 if config loaded
}
return 0; // return 0 if config NOT loaded
}
// save the CONFIGURATION in to EEPROM
void saveConfig() {
for (unsigned int i=0; i<sizeof(CONFIGURATION); i++)
EEPROM.write(CONFIG_START + i, *((char*)&CONFIGURATION + i));
}
void setup() {
Serial.begin(9600);
Serial.println("Hello world!"); // prints hello with ending line break
if(loadConfig()){
Serial.println("Config loaded:");
Serial.println(CONFIGURATION.version);
Serial.println(CONFIGURATION.my_setting_integer);
}else{
Serial.println("Config not loaded!");
saveConfig(); // overwrite with the default settings
}
}
void loop() {
//every 5s increment and save the settings!
delay(5000);
CONFIGURATION.my_setting_integer++;
saveConfig();
}
答案 0 :(得分:4)
它是for循环中的“ <=“。
将其更改为“ <”,然后重试。
提示:典型的缓冲区溢出问题