esp8266 EEPROM操作,储存数据到flash中

💡 原文中文,约1500字,阅读约需4分钟。
📝

内容提要

使用ESP8266时,可将配网信息存入EEPROM以避免每次配网的麻烦。需引入EEPROM库,写入后必须调用commit才生效。文章给出操作函数:用联合体将int拆为两个字节实现Write_Int/Read_Int;Write_String先写入字符串长度再逐字节保存并commit,Read_String按长度逐字节读出拼接。

🔎

延伸解读

commit 是写入生效的关键

文中多次强调 EEPROM.write() 后必须调用 EEPROM.commit() 才能将数据真正保存到 flash。这意味着在写入配网信息等场景时,若遗漏 commit,断电后数据会丢失。同时,频繁 commit 可能影响 flash 寿命,建议在批量写入后统一提交,而非每次 write 都 commit。

联合体拆分 int 的存储技巧

文章利用联合体 int_value 将 int 类型拆分为两个字节,分别写入 EEPROM 的两个地址,读取时再组合还原。这种方法简单直接,但依赖于 int 在 ESP8266 上占 2 个字节的假设。若平台或编译器不同,int 长度可能变化,导致存储错位,移植时需留意。

字符串存储的长度前缀设计

Write_String 先在一个地址写入字符串长度,再从另一地址逐字节保存内容;Read_String 则先读长度再按长度读取字符拼接。这种设计能正确还原字符串,但长度仅用一个字节存储,最大只能表示 255 个字符,超长字符串会被截断,使用时需确保配网信息等数据不超过此限制。

❓

Q&A

ESP8266 怎么把配网信息保存到 flash 里,避免每次重新配网?

使用 EEPROM 库将配网信息写入 EEPROM,写入后调用 EEPROM.commit() 使数据生效,这样下次上电可直接读取,无需重新配网。

ESP8266 的 EEPROM 写入后必须调用 commit 吗?

是的,EEPROM.write() 只是写入缓存,必须调用 EEPROM.commit() 才会真正保存到 flash 中。

如何在 ESP8266 的 EEPROM 中存储和读取 int 类型数据?

使用联合体 union 将 int 拆分为两个字节,分别写入两个连续地址,读取时再组合成 int。示例函数 Write_Int 和 Read_Int 实现了该功能。

ESP8266 EEPROM 存储字符串时,如何记录字符串长度?

在写入字符串前,先将字符串长度写入一个指定的地址(len_addr),然后从另一个地址开始逐个字节写入字符串内容。读取时先读取长度,再按长度逐个字节读出并拼接。

ESP8266 的 EEPROM 库中,write 和 read 函数的参数是什么?

EEPROM.write(addr, value) 中 addr 是地址,value 是要写入的字节值;EEPROM.read(addr) 返回指定地址的字节值。

ESP8266 的 EEPROM 存储数据时,为什么需要 delay(10)?

在 Write_String 函数中,写入所有字节后调用 delay(10) 是为了确保数据稳定,然后再执行 EEPROM.commit() 将数据保存到 flash。

🏷️

标签

➡️

继续阅读