首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >首选项NVS不能保存超过11个字节的数组

首选项NVS不能保存超过11个字节的数组
EN

Stack Overflow用户
提问于 2021-12-17 16:41:13
回答 1查看 270关注 0票数 1

为什么不能使用putBytes在首选项中存储大小超过11个字节的数组。

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

代码语言:javascript
复制
#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() {
}

这是带有: config_wifi.WIFI_PASSWORD="LongStringForTest";的输出

代码语言:javascript
复制
Starting
Saving...
[D][main.cpp:10] save_config(): save_config Start
Saved
Read
Read
WIFI_SSID=network
WIFI_PASSWORD=es

这是输出与:config_wifi.WIFI_PASSWORD=“短”;

代码语言:javascript
复制
Starting
Saving...
[D][main.cpp:10] save_config(): save_config Start
Saved
Read
Read
WIFI_SSID=network
WIFI_PASSWORD=Short
EN

回答 1

Stack Overflow用户

发布于 2021-12-18 22:01:45

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

这是工作密码。

代码语言:javascript
复制
#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() {
}

控制台输出:

代码语言:javascript
复制
[E][main.cpp:66] setup(): WIFI_SSID network
[E][main.cpp:67] setup(): WIFI_SSID LongStringForTest

感谢那些帮助我的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70396661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档