基于Arduino IDE 野火ESP8266模块 文件系统LittleFS 的开发
一、文件系统LittleFS的介绍
LittleFS是一个为微控制器设计的轻量级、可靠且高性能的文件系统。它专为嵌入式设备打造,拥有占用空间小、对硬件要求低的特点,同时保证在断电情况下数据的完整性和稳定性。
1.设计与特点
LittleFS的设计旨在提供嵌入式系统所需的高效、可靠的文件存储解决方案。它采用日志结构的文件系统设计,确保在突然断电或系统崩溃时数据不会损坏。同时,LittleFS通过磨损均衡算法来延长闪存的使用寿命,这对于使用有限次写入周期的闪存设备来说尤为重要。
2.性能
LittleFS在写入性能方面表现出色,特别是在处理大量小文件时。它的写入速度通常优于许多其他嵌入式文件系统,这使得它成为需要频繁写入操作的嵌入式应用的理想选择。
3. 灵活性
LittleFS非常灵活,可以配置为使用设备的任何部分作为存储。这意味着你可以根据项目的需求选择使用内部闪存、外部SD卡或其他存储设备来存储文件。
4. 兼容性
LittleFS与多种嵌入式开发环境和平台兼容,包括Arduino IDE。这使得它易于集成到各种嵌入式项目中,无论是使用ESP8266还是其他微控制器。
5.使用与集成
使用LittleFS库,你可以通过简单的API调用进行文件的创建、打开、读取、写入和删除等操作。这些API函数提供了直观且易于使用的接口,使得文件操作变得简单而高效。
6.安全性与稳定性
LittleFS注重数据的完整性和安全性。它采用了一系列措施来确保数据的完整性和稳定性,即使在恶劣的嵌入式环境中也能保持可靠的性能。
总的来说,LittleFS是一个强大、可靠且高效的嵌入式文件系统解决方案。它提供了易于使用的API、出色的性能和灵活的配置选项,使得在嵌入式设备上管理文件变得更加简单和高效。无论是用于数据存储、日志记录还是其他文件操作,LittleFS都是一个值得考虑的优秀选择。
二、库文件
需要Arduino IDE中已经安装LittleFS库。
三、代码
初始化LittleFS,代码如下
#include <LittleFS.h> void setup() { Serial.begin(115200); if (!LittleFS.begin()) { Serial.println("LittleFS Mount Failed"); return; } Serial.println("LittleFS Mounted"); // ... 其他初始化代码 ...
}
一旦LittleFS被成功挂载,就可以使用它提供的API来创建、读取、写入和删除文件了。
写入文件,代码如下:
void writeToFile(const char *filename, const char *data) { File file = LittleFS.open(filename, FILE_WRITE); if (!file) { Serial.println("Failed to open file for writing"); return; } if (file.print(data)) { Serial.println("File written"); } else { Serial.println("Write failed"); } file.close();
}
读取文件
void readFromFile(const char *filename) { File file = LittleFS.open(filename, FILE_READ); if (!file) { Serial.println("Failed to open file for reading"); return; } Serial.println("Reading file:"); while (file.available()) { Serial.write(file.read()); } file.close();
}
清理和卸载LittleFS
代码结束时,可以选择清理LittleFS占用的资源。在loop()函数的末尾或setup()函数中的某个错误处理路径中完成。
void loop() { // ... 代码 ...
} void shutdown() { LittleFS.end();
}
处理存储空间
由于ESP8266的存储空间有限,需要确保不会超出其限制。LittleFS提供了一些API来检查和管理存储空间,比如LittleFS.space() 可以获取剩余空间。
注意事项
1.确保ESP8266有足够的闪存空间来支持LittleFS。
2.注意文件路径和名称的长度,因为嵌入式系统的资源有限。
3.频繁地创建和删除文件可能会降低闪存的使用寿命,所以尽量优化文件操作。
4.如果ESP8266断电或重启,LittleFS通常会保留其状态,建议在关键数据上进行额外的持久性保护。
完整代码如下
#include <LittleFS.h>
//#include "FS.h"const char* testPath ="/log.txt";
const char* testInfo ="this is log";void setup() { Serial.begin(115200); Serial.println();if (!LittleFS.begin()) { Serial.println("LittleFS Mount Failed"); return; } Serial.println("LittleFS Mounted"); // ... 其他初始化代码 ... writeToFile(testPath,testInfo);readFromFile(testPath);shutdown();
}void writeToFile(const char *filename, const char *data) { File file = LittleFS.open(filename, "w"); if (!file) { Serial.println("Failed to open file for writing"); return; } if (file.print(data)) { Serial.println("File written"); } else { Serial.println("Write failed"); } file.close();
}void readFromFile(const char *filename) { File file = LittleFS.open(filename, "r"); if (!file) { Serial.println("Failed to open file for reading"); return; } Serial.println("Reading file:"); while (file.available()) { Serial.write(file.read()); } file.close();
}void shutdown() { LittleFS.end();
}void loop() { // ... 代码 ...
}
运行效果,如下:
四、综合实验
LittleFS和JSON数据处理
// Example: storing JSON configuration file in flash file system
//
// Uses ArduinoJson library by Benoit Blanchon.
// https://github.com/bblanchon/ArduinoJson
//
// Created Aug 10, 2015 by Ivan Grokhotkov.
//
// This example code is in the public domain.#include <ArduinoJson.h>
#include "FS.h"
#include <LittleFS.h>// more and possibly updated information can be found at:
// https://arduinojson.org/v6/example/config/bool loadConfig() {File configFile = LittleFS.open("/config.json", "r");if (!configFile) {Serial.println("Failed to open config file");return false;}StaticJsonDocument<200> doc;auto error = deserializeJson(doc, configFile);if (error) {Serial.println("Failed to parse config file");return false;}const char* serverName = doc["serverName"];const char* accessToken = doc["accessToken"];// Real world application would store these values in some variables for// later use.Serial.print("Loaded serverName: ");Serial.println(serverName);Serial.print("Loaded accessToken: ");Serial.println(accessToken);return true;
}bool saveConfig() {StaticJsonDocument<200> doc;doc["serverName"] = "api.example.com";doc["accessToken"] = "128du9as8du12eoue8da98h123ueh9h98";File configFile = LittleFS.open("/config.json", "w");if (!configFile) {Serial.println("Failed to open config file for writing");return false;}serializeJson(doc, configFile);return true;
}void setup() {Serial.begin(115200);Serial.println("");delay(1000);Serial.println("Mounting FS...");if (!LittleFS.begin()) {Serial.println("Failed to mount file system");return;}if (!saveConfig()) {Serial.println("Failed to save config");} else {Serial.println("Config saved");}if (!loadConfig()) {Serial.println("Failed to load config");} else {Serial.println("Config loaded");}
}void loop() {}
运行效果:
相关文章:
基于Arduino IDE 野火ESP8266模块 文件系统LittleFS 的开发
一、文件系统LittleFS的介绍 LittleFS是一个为微控制器设计的轻量级、可靠且高性能的文件系统。它专为嵌入式设备打造,拥有占用空间小、对硬件要求低的特点,同时保证在断电情况下数据的完整性和稳定性。 1.设计与特点 LittleFS的设计旨在提供嵌入式系统所…...
通讯录改造———文件版本
上一篇文章我们详细讲了文件操作,这时候我们就可以把通讯录保存到文件中,这样即使程序退出了,联系人的信息也还是保存着,下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。 保存 首先我们要在退出通讯录之前把联系人…...
FastAPI Web框架教程 第13章 WebSocket
13-1 WebSocket是什么 WebSocket简介: WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在WebSocket API中,浏览器和服务器只需要完成一…...
将 Elasticsearch 向量数据库引入到数据上的 Azure OpenAI 服务(预览)
作者:来自 Elastic Aditya Tripathi Microsoft 和 Elastic 很高兴地宣布,全球下载次数最多的向量数据库 Elasticsearch 是公共预览版中 Azure OpenAI Service On Your Data 官方支持的向量存储和检索增强搜索技术。 这项突破性的功能使你能够利用 GPT-4 …...
SeLinux 常见的宏
在SeLinux框架中,google定义好了一些宏,我们使用这些宏,开发时可以更加方便。大部分的宏是定义在te_macros文件中 type_transition type_transition source_type target_type : class default_type当主体进程域source_type 对target_type 类…...
图解PyTorch中的torch.gather函数和 scatter 函数
前言 torch.gather在目前基于 transformer or query based 的目标检测中,在最后获取目标结果时,经常用到。 这里记录下用法,防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义:从原tensor中获…...
Pytorch实用教程: torch.tensor()的用法
在PyTorch中,torch.tensor()函数是用来创建张量(Tensor)的一个非常基础和重要的函数。张量是PyTorch中的基本数据结构,用于存储和操作数据,可以看作是一个高维数组。torch.tensor()函数可以从数据创建新的张量…...
Java设计模式详解:工厂模式
Java设计模式详解:工厂模式 文章目录 Java设计模式详解:工厂模式前言一、工厂模式是个啥?二、工厂模式怎么用?三、工厂模式啥时候用?四、工厂模式的优点总结 前言 今天咱们来聊聊设计模式中的一位重要成员——工厂模式…...
Python爬虫:爬虫常用伪装手段
目录 前言 一、设置User-Agent 二、设置Referer 三、使用代理IP 四、限制请求频率 总结 前言 随着互联网的快速发展,爬虫技术在网络数据采集方面发挥着重要的作用。然而,由于爬虫的使用可能会对被爬取的网站造成一定的压力,因此&#…...
【数据结构】非线性结构---二叉树
1、树 1.1 树的相关概念 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…...
【战略前沿】与中国达成生产协议后,飞行汽车即将起飞
【原文】Flying cars edge towards takeoff after Chinese production deal 【作者】Thomas Macaulay 斯洛伐克公司KleinVision签署了一项协议,将大规模生产AirCar。 一辆获得航空认证的飞行汽车向商业化又迈出了一大步。 空中汽车的创造者KleinVision今天宣布出售…...
谷粒商城实战(007 压力测试)
Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第141p-第p150的内容 简介 安装jmeter 安装jmeter 使用中文 这样写就是200个线程循环100次 一共是2万个请求 介绍线程组 添加请求 可以是htt…...
使用CSS计数器,在目录名称前加上了序号,让目录看起来更加井然有序
目录(Text of Contents缩写为TOC),其实就是一篇文章的概要或简述。这好比,去书店买书,先是被这本书的标题所吸引,而后我们才会,翻开这本书目录,看看这本书主要是在讲些什么ÿ…...
SSH常见运维总结
1 -bash: ssh: command not found 解决办法:"yum install -y openssh-server openssh-clinets" 2 ssh登录时提示:Read from socket failed: Connection reset by peer. 原因:/etc/ssh/下没有ssh*key*文件 解决&…...
uni app 扫雷
闲来无聊。做个扫雷玩玩吧,点击打开,长按标记,标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…...
MATLAB绘制堆叠填充图--巧用句柄
MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…...
JQuery的定义
jQuery是一个js库,使用jQuery会比js简单一点 jQuery文件是一个自执行函数 jQuery文件是一个自执行函数 $传递的参数不同,效果也不同: 传递的是匿名函数,那$就是一个入口函数,传递的是一个字符串,那$就…...
【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码
文章目录 一、先来先服务调度算法(FCFS) 二、短作业优先调度算法(SJF) 三、高响应比优先调度算法(HRRN) 四、轮转调度算法(RR) 五、最早截至时间优先算法(EDF&#…...
Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)
1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果,但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下,深度学习模型的适应程度变低,检测结果也随之下降,因此研究在复杂气象条件下的目标检测方法…...
Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告
Jenkins支持的JDK版本17、21,通过java -version查看当前JDK版本,确认是否匹配 打开网址https://www.jenkins.io/download 点击下载,选择mac版本 commend空格打开终端,输入安装命令brew install jenkins 安装完成后输入brew servi…...
redis-Hash
一,应用场景 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。 二,命令 H…...
Kubernetes kafka系列 | Strimzi 部署kafka-bridge
Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件,用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台,广泛用于构建实时数据流水线和流式应用程序。然而…...
AR和VR如何改变客户体验?
How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…...
微信小程序中实现埋点的方法
在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…...
vue记事本渲染以及交互
以下是记事本的源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本</title><styl…...
Zookeeper中的脑裂
简单点来说,脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点,它们都知道在这个cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候,就会达成共识,选出其中一个作为 master。但是如果它们之间…...
【漏洞复现】金和OA XmlDeal.aspx XXE漏洞
0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…...
对比:React 还是 Vue
自己之前的开发栈一直是 Vue,对 Vue 的设计理念及底层实现原理算是颇有了解;随着公司技术迭代,近半年来开始接触&使用 React。 前面写了几篇关于 React 的文章,但大部分都是知识点以及开发过程问题的沉淀总结。 这篇文章想尝…...
ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法
前言 默认 SD 卡分区是 FAT32 格式,为了用于嵌入式Linux ext4 文件系统,需要改为 ext4 文件系统,但是SD 卡分区类型默认是 msdos 类型,也就是 MBR 类型,不是 GPT 类型。 烧写 ext4 分区表,或者使用 ubuntu…...
Kubernetes(K8s)技术解析
1. K8s简介 Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案,帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…...
整形网站专题素材/公司网站建设流程
JAVA面向对象基础 1、说一下什么是面向对象 面向对象是一种编程思想,它是相对于面向过程而言的,从执行者变为了指挥者,通过这种思想来将生活中复杂的事情简单化 面向对象就是把一个对象抽象成类,具体来说就是把一个对象的静态特…...
公司网站做推广支出分录/seo销售代表招聘
Keras CIFAR-10图像分类 AlexNet 文章目录 Keras CIFAR-10图像分类 AlexNetkeras介绍keras具有的特性keras与后端引擎keras设计原则安装keras导入库控制GPU显存(可选)加载 CIFAR-10 数据集可视化数据数据预处理AlexNet网络开始训练模型可视化准确率、损失函数保存模型预测结果…...
自己买服务器搭建网站/关键词难易度分析
从用户角度来说,交互设计是一种如何让产品更易用,让用户更愉悦的产品设计。它致力于了解目标用户和他们的期望,了解用户在同产品交互时彼此的行为,了解用户心理和行为特点。 以下就介绍一下在交互设计中一些通用的原则。…...
信科网络广州建网站/东莞网站seo公司
原文链接:【ACL2020】DeeBERT:衡量性能与效率的 BERT 推理方法 DeeBERT 作者信息 Elesdspline 目前从事NLP与知识图谱相关工作。 导语 近年来预训练在 NLP 领域的各个任务上都表现出来很好的效果,但是在推理速度方面却不如人意,…...
网站建设相关优化/悟空建站seo服务
它们彼此相反.doLayout用作extends标记的一部分. extends标记指定要扩展的模板,doLayout标记指定扩展模板中注入代码的位置.include标记只是指定应在指定的点注入另一个模板.因此,doLayout以类似的方式工作,除了doLayout标记没有指定注入哪个模板.这是通过extends标签完成的,这…...
网站建设cms/sem优化是什么
前言 Beautiful Soup是python的一个HTML或XML的解析库,我们可以用它来方便的从网页中提取数据,它拥有强大的API和多样的解析方式。 Beautiful Soup的三个特点: Beautiful Soup提供一些简单的方法和python式函数,用于浏览ÿ…...