简体   繁体   中英

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM