当前位置:网站首页>Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
2022-08-03 07:35:00 【perseverance52】
Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
NVS
非易失性存储库介绍
非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据。本文档将详细介绍 NVS 常用的一些概念。
- 引用:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/storage/nvs_flash.html
NVS 最适合存储一些较小的数据,而非字符串或二进制大对象 (BLOB) 等较大的数据。如需存储较大的 BLOB 或者字符串,请考虑使用基于磨损均衡库的 FAT 文件系统。
在Arduino框架下,NVS区域在分区表上的体现:
分区表配置文件位置:
C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\tools\partitions
Arduino IDE
分区表配置信息选项:
NVS区域具体在每一份分区表当中的体现
以
app13Mfat3M.csv
为例:
在Arduino环境下,不同的分区表默认配置的NVS容量都是
5000
Byte(字节)
NVS 存储对象
像用户的一般数据存储例如wifi信息,eeprom库也是使用了其中的一部分。
用户如何使用NVS 来存储数据
相关头文件位置:
C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\Preferences\src
- 获取数据函数
int8_t getChar(const char* key, int8_t defaultValue = 0);
uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
int16_t getShort(const char* key, int16_t defaultValue = 0);
uint16_t getUShort(const char* key, uint16_t defaultValue = 0);
int32_t getInt(const char* key, int32_t defaultValue = 0);
uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
int32_t getLong(const char* key, int32_t defaultValue = 0);
uint32_t getULong(const char* key, uint32_t defaultValue = 0);
int64_t getLong64(const char* key, int64_t defaultValue = 0);
uint64_t getULong64(const char* key, uint64_t defaultValue = 0);
float_t getFloat(const char* key, float_t defaultValue = NAN);
double_t getDouble(const char* key, double_t defaultValue = NAN);
bool getBool(const char* key, bool defaultValue = false);
size_t getString(const char* key, char* value, size_t maxLen);
String getString(const char* key, String defaultValue = String());
size_t getBytesLength(const char* key);
size_t getBytes(const char* key, void * buf, size_t maxLen);
- 读取数据函数
size_t putChar(const char* key, int8_t value);
size_t putUChar(const char* key, uint8_t value);
size_t putShort(const char* key, int16_t value);
size_t putUShort(const char* key, uint16_t value);
size_t putInt(const char* key, int32_t value);
size_t putUInt(const char* key, uint32_t value);
size_t putLong(const char* key, int32_t value);
size_t putULong(const char* key, uint32_t value);
size_t putLong64(const char* key, int64_t value);
size_t putULong64(const char* key, uint64_t value);
size_t putFloat(const char* key, float_t value);
size_t putDouble(const char* key, double_t value);
size_t putBool(const char* key, bool value);
size_t putString(const char* key, const char* value);
size_t putString(const char* key, String value);
size_t putBytes(const char* key, const void* value, size_t len);
- 数据操作函数
bool clear();
bool remove(const char * key);
操作流程
示例程序
本示例展示的是对
结构体
数据对象进行存储,比起使用eeprom
库来实现,在操作上来讲要简单的多。
/* This example shows how to use Preferences (nvs) to store a structure. Note that the maximum size of a putBytes is 496K or 97% of the nvs partition size. nvs has signifcant overhead, so should not be used for data that will change often. */
#include <Preferences.h>//引入头文件
Preferences prefs;
typedef struct {
uint8_t hour;
uint8_t minute;
uint8_t setting1;
uint8_t setting2;
} schedule_t;
void setup() {
Serial.begin(115200);
delay(2000);
while(!Serial);
prefs.begin("schedule"); // use "schedule" namespace
Serial.println(prefs.freeEntries());//获取该"schedule" 命名空间大小:414
uint8_t content[] = {
9, 30, 235, 255, 20, 15, 0, 1}; // two entries
prefs.putBytes("schedule", content, sizeof(content));//将数组存储进"schedule"命名的空间
size_t schLen = prefs.getBytesLength("schedule");
char buffer[schLen]; // prepare a buffer for the data
prefs.getBytes("schedule", buffer, schLen);//获取"schedule"命名的空间数据的大小
if (schLen % sizeof(schedule_t)) {
// 对存储的数据进行校验
log_e("Data is not correct size!");
return;
}
schedule_t *schedule = (schedule_t *) buffer; // 用结构体指针指向buffer数组名,将数组成员赋值给结构体成员变量
Serial.printf("%02d:%02d %d/%d\n",
schedule[1].hour, schedule[1].minute,
schedule[1].setting1, schedule[1].setting2);//20:15 0/1
Serial.printf("%02d:%02d %d/%d\n",
schedule[0].hour, schedule[0].minute,
schedule[0].setting1, schedule[0].setting2);//09:30 235/255
schedule[2] = {
8, 30, 20, 21}; // add a third entry (unsafely)
// force the struct array into a byte array
prefs.putBytes("schedule", schedule, 3*sizeof(schedule_t));
schLen = prefs.getBytesLength("schedule");
char buffer2[schLen];
prefs.getBytes("schedule", buffer2, schLen);
for (int x=0; x<schLen; x++) Serial.printf("%02X ", buffer[x]);//09 1E EB FF 14 0F 00 01 08 1E 14 15
Serial.println();
}
void loop() {
}
- 串口打印信息
边栏推荐
猜你喜欢
随机推荐
前缀和(区间和,子矩阵的和)
训练正常&异常的GAN损失函数loss变化应该是怎么样的
rust 学习笔记
薛定谔的对象属性判断
基于SSM开发的的小区物业管理系统小程序源码
Fortify白盒神器20.1.1下载及安装(非百度网盘)
- display image API OpenCV 】 【 imshow () to a depth (data type) at different image processing methods
Neo4j 4.X:导入OWL文件
ORB-SLAM2提取特征点
Evaluate:huggingface评价指标模块入门详细介绍
华为设备配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down)
pyspark---encode the suuid interval (based on the number of exposures and clicks)
如何在安装GBase 8c数据库的时候,报错显示“Host ips belong to different cluster?
drop database出现1010
品牌方发行NFT时,应如何考量实用性?
Poke the myth of Web3?Poke the iron plate.
第十二天&接口和协议
REST学习
The ORB - SLAM2 extracting feature points
The use of the database table structure document generation tool screw