c++ - 从 eeprom 接收数据时程序崩溃
问题描述
每次我尝试运行此链接中的代码时,我的程序都会崩溃。问题似乎出在这一行*((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 循环中的“<=”。
将其更改为“<”并重试。
提示:典型的缓冲区溢出问题
推荐阅读
- tomcat9 - 使用cmd运行tomcat服务器的问题
- quarkus - 是否可以在自定义扩展中使用 Qute 模板?
- python - 正则表达式:准确输入 4 位数字,检查输入的数字是否出现在前 10,000 个字符中
- json - 来自 Spring REST API 端点的文本响应,如何在 Angular 前端检索它
- python - 在 python 中使用 su 的多个命令 - 用户
- python - 如何记录 tensorflow 对象检测 api 的训练和结果?
- visual-studio-code - VS 代码扩展在编辑其 JS 后不反映更改
- html - 为什么 w3 验证器说“元素
- 不允许作为元素的子元素
- 在这种情况下”?
- logging - Xamarin 表单中的多目标和使用 Microsoft.Extensions.Logging
- sql - 如何处理多列上的重复项?