二维数组中的数据消失了
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]);
}
我很难在 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]);
}