Why can't I store arrays with size over 11 bytes inside Preferences using putBytes.
this code is not telling whole story here is complete code to show the problem. I put the console output down...
#include <Arduino.h>
#include <Preferences.h>
struct Config_wifi_t{
String WIFI_SSID;
String WIFI_PASSWORD;
};
bool save_config(Config_wifi_t config_wifi){
log_d("save_config Start");
Preferences prefs;
prefs.begin("c_wifi"); // Name space m_config
prefs.putBytes("c_wifi", &config_wifi, sizeof(config_wifi));
prefs.end();
return true;
}
Config_wifi_t get_config(){
Preferences prefs;
Config_wifi_t config_wifi;
prefs.begin("c_wifi");
size_t schLen = prefs.getBytesLength("c_wifi");
char buffer[schLen];
if(schLen==0){
log_d("EMPTY MEMORY");
return config_wifi;
}
prefs.getBytes("c_wifi", buffer, schLen);
Config_wifi_t *c_wifi = (Config_wifi_t *) buffer;
config_wifi = *c_wifi;
prefs.end();
return config_wifi;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(1000);
Serial.println("Starting");
Config_wifi_t config_wifi;
config_wifi.WIFI_SSID="network";
config_wifi.WIFI_PASSWORD="LongStringForTest";
Serial.println("Saving...");
save_config(config_wifi);
Serial.println("Saved");
Serial.println("Read");
Config_wifi_t config_wifi2;
config_wifi2 = get_config();
Serial.println("Read");
Serial.print("WIFI_SSID=");
Serial.println(config_wifi2.WIFI_SSID);
Serial.print("WIFI_PASSWORD=");
Serial.println(config_wifi2.WIFI_PASSWORD);
}
void loop() {
}
This are the output with: config_wifi.WIFI_PASSWORD="LongStringForTest";
Starting
Saving...
[D][main.cpp:10] save_config(): save_config Start
Saved
Read
Read
WIFI_SSID=network
WIFI_PASSWORD=es
This are the output with: config_wifi.WIFI_PASSWORD="Short";
Starting
Saving...
[D][main.cpp:10] save_config(): save_config Start
Saved
Read
Read
WIFI_SSID=network
WIFI_PASSWORD=Short
The problem was a ptr and life cycle problem.
This are working code.
#include <Arduino.h>
#include <Preferences.h>
struct Config_wifi_t{
bool result;
char WIFI_SSID[50];
char WIFI_PASSWORD[50];
};
bool save_config(Config_wifi_t *config_wifi){
log_d("save_config Start");
Preferences prefs;
prefs.begin("c_wifi");
prefs.putBytes("c_wifi", config_wifi, sizeof(Config_wifi_t));
prefs.end();
return true;
}
Config_wifi_t get_config(){
Preferences prefs;
prefs.begin("c_wifi");
size_t schLen = prefs.getBytesLength("c_wifi");
char buffer[schLen];
Config_wifi_t *_config_wifi = (Config_wifi_t *) buffer;
if(schLen==0){
log_d("EMPTY MEMORY");
_config_wifi->result=false;
return *_config_wifi;
}
prefs.getBytes("c_wifi", buffer, schLen);
if (schLen % sizeof(Config_wifi_t)) { // simple check that data fits
log_e("Data is not correct size!");
_config_wifi->result=false;
return *_config_wifi;
}
_config_wifi = (Config_wifi_t *) buffer;
return _config_wifi[0];
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting");
struct Config_wifi_t config_wifi;
strcpy(config_wifi.WIFI_SSID,"network");
strcpy(config_wifi.WIFI_PASSWORD,"LongStringForTest");
Serial.println("Saving...");
save_config(&config_wifi);
Serial.println("Saved");
Serial.println("Read");
Config_wifi_t confFromNvs;
confFromNvs = get_config();
Serial.println("Readed");
log_e("WIFI_SSID %s",confFromNvs.WIFI_SSID);
log_e("WIFI_SSID %s",confFromNvs.WIFI_PASSWORD);
}
void loop() {
}
console output:
[E][main.cpp:66] setup(): WIFI_SSID network
[E][main.cpp:67] setup(): WIFI_SSID LongStringForTest
thanks to the people that help.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.