二维数组中的数据消失了

Data in 2D array is Gone

我很难在 CPP 中使用这个二维数组。 我尝试关注 this link,但它并没有解决我的问题。

saveApToEeprom()函数中我保存了两个字符串。 这很好用。然后我想使用 getConfigForEeprom() 从 EEPROM 读取。这就是问题所在。

函数 getConfigForEeprom() 打印 2 次 32 字节,与我在 saveApToEeprom() 中看到的匹配。但是当程序进入 dumbDataEeprom() 时,valueEeprom[1] 中的所有数据似乎都消失了,除了 valueEeprom[0] 还在。

有谁知道如何解决这个问题?

我的代码见下文

main.cpp

#include <eeprom_handler.h>
void setup(){
  initEeprom();

  String ssid = "test";
  String psw = "tset";
 
  saveApToEeprom(ssid, psw);

  uint8_t** valuesOutEeprom = getConfigForEeprom();
  dumbDataEeprom(valuesOutEeprom);
}

void loop() {
}

eeprom_handler.h

#ifndef eeprom_handler_H
#define eeprom_handler_H

#include <Arduino.h>
#include <String.h>
#include <EEPROM.h>

/* PARAMETERS EEPROM*/
#define PARAMETER_SIZE_IN_BYTES          32
#define PARAMETERS_EEPROM                2
#define BYTES_NEEDED_FROM_EEPROM         (PARAMETER_SIZE_IN_BYTES*PARAMETERS_EEPROM)

/* FUNCTIONS EEPROM */
void initEeprom(uint8_t nmrOfBytes = BYTES_NEEDED_FROM_EEPROM);
uint8_t saveApToEeprom(String apSsid, String ApPsw);
uint8_t** getConfigForEeprom(uint8_t nmrOfBytes = BYTES_NEEDED_FROM_EEPROM);
void dumbDataEeprom(uint8_t** valuesOutEeprom);
void clearEeprom(uint8_t nmrOfBytes = BYTES_NEEDED_FROM_EEPROM);

#endif // eeprom_handler_H

eeprom_handler.cpp

/**************************************************************************/
/*!
  @brief    Read data from the EEPROM
  @param    nmrOfBytes              uint8_t: total number of bytes of the EEPROM to read
  @return   valueEeprom             uint8_t[][]: 
                                    [0-32][]) 32 bytes, should contain SSID
                                    [][0-32]) 32 bytes, should contain SSID
*/
/**************************************************************************/
//  TODO reconstruct uint8_t to chars
uint8_t** getConfigForEeprom(uint8_t nmrOfBytes){
    if (Serial){
        Serial.println("Class eeprom_handler, function: getConfigForEeprom");
    }

    // init the 2D array
    uint8_t** valueEeprom = new uint8_t* [PARAMETERS_EEPROM];

    for (uint8_t m = 0; m < PARAMETERS_EEPROM; m++){
        valueEeprom[m] = new uint8_t[BYTES_NEEDED_FROM_EEPROM];
    }

    for(uint8_t i = 0; i < PARAMETER_SIZE_IN_BYTES; i ++ ) {
        valueEeprom[0][i] = EEPROM.read(i);
        Serial.println(valueEeprom[0][i]);
    }

    for(uint8_t j = PARAMETER_SIZE_IN_BYTES; j < BYTES_NEEDED_FROM_EEPROM; j ++ ) {
        valueEeprom[1][j] = EEPROM.read(j);
        Serial.println(valueEeprom[1][j]);
    }  

    return valueEeprom;
}

/**************************************************************************/
/*!
  @brief    Serial print the data read from the EEPROM
  @param    valuesOutEeprom         uint8_t**: pointer to a uint8_t 2D array
*/
/**************************************************************************/
void dumbDataEeprom(uint8_t** valuesOutEeprom){
    if (Serial){
        Serial.println("Class eeprom_handler, function: dumbDataEeprom");
        for (uint8_t i = 0; i < PARAMETERS_EEPROM; i++){
            for (uint8_t j = 0; j < PARAMETER_SIZE_IN_BYTES; j++){
                Serial.print(valuesOutEeprom[i][j]);
            }
        Serial.println();
        }
    }
}

输出(串行)

Class eeprom_handler, function: initEeprom    
Class eeprom_handler, function: saveApToEeprom
Class eeprom_handler, function: clearEeprom
0  
116
1  
101
2  
115
3  
116
32 
116
33 
115
34
101
35
116

Class eeprom_handler, function: getConfigForEeprom
116
101
115
116
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

116
115
101
116
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Class eeprom_handler, function: dumbDataEeprom
1161011151160000000000000000000000000000
00000000000000000000000000000000

已解决

我的函数中的 for 循环有问题。我正在将 EEPROM 索引 [32-63] 的数据也写入数组索引 [32-62],但这需要转到数组索引 [0-32]

原文:

    for(uint8_t j = PARAMETER_SIZE_IN_BYTES; j < BYTES_NEEDED_FROM_EEPROM; j ++ ) {
        valueEeprom[1][j] = EEPROM.read(j);
        Serial.println(valueEeprom[1][j]);
    }  

正确:

    for(uint8_t j = PARAMETER_SIZE_IN_BYTES; j < BYTES_NEEDED_FROM_EEPROM; j ++ ) {
        valueEeprom[1][j - PARAMETER_SIZE_IN_BYTES] = EEPROM.read(j);
        Serial.println(valueEeprom[1][j - PARAMETER_SIZE_IN_BYTES]);
    }