繁体   English   中英

首选项 NVS 无法保存超过 11 个字节的数组

[英]Preferences NVS can not save array over 11 bytes

为什么我不能使用 putBytes 在 Preferences 中存储大小超过 11 个字节的 arrays。

这段代码并没有讲述整个故事,这里是显示问题的完整代码。 我把控制台output放下...

#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() {
}

这是 output 与: 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

这是 output 与: 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

问题是一个ptr和生命周期问题。

这是工作代码。

#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() {
}

控制台 output:

[E][main.cpp:66] setup(): WIFI_SSID network
[E][main.cpp:67] setup(): WIFI_SSID LongStringForTest

感谢帮助的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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