基于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…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
