CPP中读取EEPROM返回二维数组第二个元素数据丢失问题
问题根因
你在getConfigForEeprom函数中对第二组数据的存储下标逻辑存在错误:
- EEPROM地址32~63存储的是第二组密码数据,你读取时直接把EEPROM的偏移地址j(值为32到63)作为
valueEeprom[1]的数组下标,相当于把数据存在了valueEeprom[1][32]到valueEeprom[1][63]的位置 - 而
dumbDataEeprom函数打印第二组数据时,仅读取valueEeprom[1][0]到valueEeprom[1][31]的位置,这部分位置你没有做任何赋值操作,自然全部为初始0值。 - 额外问题:你给每个一维数组分配了64字节(
BYTES_NEEDED_FROM_EEPROM值为64),但实际每个参数仅需要32字节,属于多余的内存分配。
修复方案
1. 修正二维数组分配大小
每个参数仅需32字节,修改getConfigForEeprom中的数组初始化代码:
for (uint8_t m = 0; m < PARAMETERS_EEPROM; m++){ // 把原本的BYTES_NEEDED_FROM_EEPROM替换为PARAMETER_SIZE_IN_BYTES valueEeprom[m] = new uint8_t[PARAMETER_SIZE_IN_BYTES]; }
2. 修正第二组数据的赋值下标逻辑
读取EEPROM中3263地址的数据时,转换为`valueEeprom[1]`的031下标:
// 原第二组数据读取逻辑替换为下面的代码 for(uint8_t j = 0; j < PARAMETER_SIZE_IN_BYTES; j ++ ) { // EEPROM地址偏移PARAMETER_SIZE_IN_BYTES,数组下标从0开始计数 valueEeprom[1][j] = EEPROM.read(j + PARAMETER_SIZE_IN_BYTES); Serial.println(valueEeprom[1][j]); }
额外优化建议
你当前通过new申请的二维数组内存没有释放,会造成内存泄漏,建议在dumbDataEeprom调用完成后添加内存释放逻辑:
// main.cpp中调用完dumbDataEeprom后添加以下代码 for (uint8_t i = 0; i < PARAMETERS_EEPROM; i++) { delete[] valuesOutEeprom[i]; } delete[] valuesOutEeprom;
内容的提问来源于stack exchange,提问作者Stefan de Kraker
相关产品推荐
相关产品推荐

