Preferences Nvs Can Not Save Array over 11 Bytes

Preferences Nvs Can Not Save Array over 11 Bytes

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
10

1 Answer

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.

1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Chloe Bennett
Author

Chloe Bennett

Chloe Bennett explores the intersection of pop culture, streaming entertainment, digital trends, and contemporary lifestyle. Her weekly commentary reaches thousands of culture enthusiasts.