gpt4 book ai didi

c++ - 从 eeprom 接收数据时程序崩溃

转载 作者:行者123 更新时间:2023-11-27 22:32:49 25 4
gpt4 key购买 nike

每次尝试运行此 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();
}

最佳答案

就是for循环中的“<=”。

将其更改为“<”并重试。

提示:典型的缓冲区溢出问题

关于c++ - 从 eeprom 接收数据时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58818014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com