首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ESP8266 EEPROM读/写-写似乎发生在读取旧值之前

在使用ESP8266的EEPROM进行读写操作时,如果你遇到了写入操作似乎在读取旧值之前发生的问题,这可能是由于代码中的逻辑错误或者对EEPROM操作的理解不够导致的。ESP8266的EEPROM实际上是在闪存中模拟的,因此处理方式与传统的EEPROM略有不同。下面是一些关键点和步骤,可以帮助你正确地进行读写操作。

理解ESP8266 EEPROM的工作原理

  1. 初始化: 在使用EEPROM之前,需要调用EEPROM.begin(size)来初始化EEPROM区域。这里的size是你打算使用的字节数。
  2. 读取: 使用EEPROM.read(address)来读取指定地址的数据。
  3. 写入: 使用EEPROM.write(address, value)来写入数据到指定地址。注意,这个操作只是将数据写入到缓冲区,并不会立即写入到闪存。
  4. 提交更改: 使用EEPROM.commit()来将缓冲区中的更改实际写入到闪存。这一步是必须的,否则更改不会被保存。
  5. 结束: 使用EEPROM.end()来释放EEPROM对象和相关资源。

常见问题解决

如果你发现写入操作似乎在读取旧值之前发生,可能是因为以下几个原因:

  1. 未提交更改: 如果在调用EEPROM.write()后没有调用EEPROM.commit(),更改不会被写入到闪存。
  2. 代码顺序问题: 确保在读取任何EEPROM值之前,所有的写入和提交操作都已经完成。
  3. 重复初始化: 如果在每次读写操作前都调用EEPROM.begin()但没有调用EEPROM.end(),可能会导致不一致的行为。

示例代码

下面是一个简单的示例,展示了如何正确地使用ESP8266的EEPROM进行读写操作:

代码语言:javascript
复制
#include <EEPROM.h>

void setup() {
  Serial.begin(115200);

  // 初始化EEPROM,假设我们使用512字节
  EEPROM.begin(512);

  // 写入数据到地址10
  EEPROM.write(10, 123);  // 写入值123到地址10
  EEPROM.commit();        // 提交更改,确保数据被写入到闪存

  // 读取地址10的数据
  int val = EEPROM.read(10);
  Serial.println(val);    // 应该输出123

  // 结束EEPROM使用
  EEPROM.end();
}

void loop() {
  // 这里不做任何事情
}

确保在每次写入数据后调用EEPROM.commit(),并且在读取数据前不要再次初始化EEPROM,除非你调用了EEPROM.end()来结束之前的会话。这样可以避免读写操作的顺序问题,确保数据的正确性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ESPcopter无人机源码分析.1

EEPROM可以不使用文件和文件系统的情况下用来固化一些数据,常见的比如用来保存SSID或者Password,保存用户设置等数据,这样就可以不用每次都通过烧程序来改变系统运行时的初始。...Arduino提供了完善的eeprom库,不过需要注意的是ESP8266没有硬件EEPROM,使用的是flash模拟的EEPROM EEPROMArduino中经常用于存储设定数据。...,你需要在读或者操作之前先通过 EEPROM.begin(size) 来声明你需要操作的存储大小,size取值范围为4~4096字节 EEPROM.write() 不会立刻把内容写进flash,如果你希望保持到...返回:无 注意点:写入的数据只是写入到申请的内存空间,并不是立刻写入到flash中 EEPROM其实是从外部flash中存储器最末尾开辟的4096字节空间 【write只一个字节的数据,所以数据的应该在...块去 参数:无; 返回:返回bool,表示是否覆盖成功; 注意点:这个方法才是真正的把数据从内存控件写回到flash空间; 而且,写回flash之前会把整一块sector全部擦除掉,也就意味着就算我们

74620

ESP8266_08基于flash的数据掉电保护

听起来像EEPROM? 确实很像,但不是!以STM32为例,片上是没有EEPROM的。但是,可以把一部分ROM当做EEPROM,通过程序进行擦写,最终实现的效果和EEPROM几乎是一样的。...ESP8266在这方面其实跟32很像,区别主要有两点: 1、ESP8266是以扇区为单位,一个扇区4KB。 2、ESP8266的最后4个扇区不能动,所以咱们要用的话,可以选倒数第5个扇区。...根据上面给出的截图和信息,可以知道,如果要实现类似EEPROM的效果,需要把数据存到“用户数据”这一部分。用户数据flash中有两部分,只要是没有被占用的,都可以。...最终实现的效果,上电的时候先把一组数据写入flash,然后循环读取这部分数据,并通过串口打印出来。开始之前先包含以下头文件: #include "spi_flash.h" 相关的读写函数都在里面了。...2 擦除该扇区 无论你要写哪个扇区,一律先擦后

1.5K31
  • STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)

    第 1、 2 个字节是温度转换后的数据信息,第 3、 4 个字节是用户 EEPROM(常用于温度报警储存)的镜像。在上电复位时其将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。...Recall EEPROM(将 EEPROM 中的报警复制到 RAM) [B8H] 此指令将 EEPROM 中的报警复制到 RAM 中的第 3、 4 个字节里。...2.5.2 向DS18B20数据0和数据1 数据时间隙的前 15uS 总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间 15~60uS,采样时间内如果控制器将总线拉高则表示...随后总线被释放后的 15uS 中 DS18B20 会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起始信号。...注意:必须在读间隙开始的 15uS 内读取数据位才可以保证通信的正确。 通信时是以 8 位“0”或“1”为一个字节,字节的是从低位开始的。

    2K30

    STM32通信模拟 I2C

    值得一提的是,《AT24Cxx.pdf》里提到每次写完之后,再到下次之前,需要间隔5ms时间,以确保上次操作芯片内部完成,如图 19.1.11 所示。...顺序模式下,需要先从当前地址模式或随机地址模式启动,随后便可连续读多个数据,时序如图 19.1.14 所示 19.2 硬件设计 如图 19.2.1 为开发板EEPROM部分的原理图,U4为AT24C02...一个字节的 EEPROM 初始地址 * data -> 要的数据指针 * 输出参数:无 * 返回:无 * 函数作用:EEPROM 一个字节 */ void EEPROM_ReadByte(uint16...多字节读写可以通过AT24Cxx的页模式和顺序模式,实现多个数据的连续读写。模式时,需要程序上设置,不能跨页,这里简单处理,直接多次调用前面的单次读写即可,如代码段 19.3.8 所示。...:addr -> 一个字节的 EEPROM 初始地址 * data -> 要的数据指针 * sz -> 要的字节个数 * 输出参数:无 * 返回:无 * 函数作用:EEPROM N 个字节

    93610

    ESP8266无人机-初始化过程

    esp8266的实现里面在这里。...返回类型:byte 返回传输的状态: 0: 成功 1: 数据量超过传送缓存容纳限制 2: 传送地址时收到 NACK 3: 传送数据时收到 NACK 4: 其它错误 如果是0,就成功: 把地址打印出来...顺便可以把这个数字引脚的也看了。 因为需要4PWM+3LED+1Buzzer的接口,提前这里就设置输入。...灯的引脚 对灯的管理 启用和使用的方法 内存块每次用EEPROM.begin(size)读入缓存里,读入的大小由size决定,该数值范围为(4-4096),每次读入的这个EEPROM块都是从ROM...所以如果就你自已用时,你爱多少就读多少,每次都从0地址开始用。 读入缓存: AHRS是无人机的精华,我不完了。 从函数里面读取挂载的传感器: 最后绿灯亮,无异常。

    82510

    无主复制系统(3)-Quorum一致性的局限性

    如果根据时间戳(最后写入胜利)挑选出一个胜者,则由于时钟偏差[35],写入可能会丢失 如果操作与操作同时发生操作可能仅反映在某些副本上。在这种情况下,不确定读取是返回还是新。...如果操作某些副本上成功,而在其他节点上失败(例如,因为某些节点上的磁盘已满),小于w个副本上写入成功。所以整体判定写入失败,但整体写入失败并没有写入成功的副本上回滚。...即使一切工作正常,有时也会不幸地出现关于时序(timing) 的边缘情况 因此,尽管法定人数似乎保证读取返回最新的写入,但在实践中并不那么简单。...尤其是,因为通常没有得到“复制延迟问题”中讨论的保证(己之,单调,一致前缀),前面提到的异常可能会发生在应用程序中。更强有力的保证通常需要事务或共识。我们将在第七章和第九章回到这些话题。...且若数据库只使用修复(无反熵过程),那么的落后就无上限。例如若一个很少被访问,则返回的可能很老了! 衡量无主复制数据库的研究,根据参数n,w和r来预测读取的预期百分比。

    40840

    从 IP 开始,学习数字逻辑:BRAM 篇(上)

    新的数据写入之前,可以多次从一指定位置读取数据。 双端口 RAM 又可以分为 Simple/Ture 双端口,这方面似乎有点复杂,将在后续的文章中详细分析。...那么当使能有效时,用户同时进行读取操作,读取到新数据还是数据。这取决于 RAM 的工作模式。 ? 工作模式分为三类:优先,优先以及 no change。...优先,在读写时钟异步的情况下,推荐使用。该模式会保证操作优先发生优先,该模式以消耗更多 BRAM 资源的前提下,保证每次操作读取到的都是先前的数据。...ena 信号置低之前操作完成,但操作被失能。 单/双端口 RAM 的应用 单端口 RAM 中,通常的应用可能是,先进行一系列写入,再进行一系列读取,循环反复。...最后是 read first 优先模式,从时序上来看,优先模式和优先模式类似,同样接收输入的同时,按照时序将数据输出,但不同在于,优先模式输出的是写入的新,而优先模式输出的是操作发生之前

    2.5K30

    详述I2C总线协议、时序,入门不再是难事

    工业领域也非常常见这种器件,一般有EEPROM和FLASH。...它俩共同点是可读可写,断电保存; 不同点是EEPROM之前不用擦除,而FLASH之前一定要擦除,否则不成功;EEPROM一般都使用I2C总线来通信,而FLASH一般是使用SPI总线。 ?...EEPROM的器件地址 读写过程 1.数据过程 1.主机发送I2C总线停止信号,防止总线忙数据失败 2.主机发送I2C总线复位信号,确保数据之前总线处于空闲状态 3.主机发送I2C总线开始信号...3.主机发送I2C总线开始信号,启动一次数据读取 4.主机发送I2C丛机地址和模式(W/R=1)信号,并且等待一个丛机的应答信号 5.主机接收到ACK的应答信号后,开始多个字节的读取,每读完一个字节需要给丛机发送一个...主机/数据过程 结语 I2C总线嵌入式应用中非常广泛,基本上所有的电力电子设备都会用到这个总线; 笔者根据自身多年的工作经验,记录下了我对它的理解,如果有的不对,希望大家能多多指出,今天的I2C

    1.8K20

    如何使用Flash模拟EEPROM

    ,这为FLASH模拟 EEPROM提供了条件,FLASH与EEPROM特点对比如下表所示: FLASH模拟EEPROM优点: 低成本:可节约一颗EEPROM芯片; 存储、读取速度快:通讯速度快于使用...字节,这个特性决定了不能简单的将数据擦除然后新数 据,因为这样会导致存储在这个扇区内的其他数据也被擦除,并且也会导致FLASH频繁擦除而降低 其使用寿命。...所以FLASH模拟EEPROM的思路是: 新数据存储不影响数据; 尽量减少FLASH擦除次数,延长FLASH使用寿命。...基于以上的考虑,我们设计了以下存储结构: EERPOM结构 EEPROM由两个页组成:页0和页1,使用的时候,1个页处于有效状态,另外一个页处于擦除 状态,读取或者写入数据都在有效状态的页进行。...页状态标志 第一个数据存储区,存储页状态标志status,页状态标志有3种: 有效状态:EE_PAGE_VALID,status = 0x0000,读取数据在此页进行; 数据转移状态:

    38910

    STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet

    */ uint8_t Update_Config_Para_To_EEPROM(uint16_t delay_ms); /*执行配置参数*/ uint8_t Runing_Config_Para_To_EEPROM...3.2、串口指令配置模块之命令操作 命令头1 命令头2 命令码 0x57 0xAB 命令比命令要简洁许多,查看手册主要支持以下指令: image.png 同样的,由于例程需要进行TCP传输...,调用如上指令前,先要将配置引脚拉低,然后开启DMA接收,接下来按照通信协议要求将对应的格式填入到发送Buffer,然后延时一段时间,直接查看串口缓存区对应数据即可,但是如上写法并不严谨,更严谨的做法是是否判断串口一共回复了多少个字节...CODE END 3 */ } 通过自己的服务器发送测试协议进行测试,由于这是我私人创建的设备,所以就不将设备ID和api-key公布出来了,结果如下: image.png image.png 之前写过类似的文章...,参考如下即可: ESP8266实战贴:使用HTTP POST请求上传数据到公有云OneNet image.png image.png 上传数据流展示: image.png 4、项目开源地址

    71920

    【STM32】HAL库 STM32CubeMX教程十二—IIC(读取AT24C02 )

    但是我们的HAL库中,对硬件IIC做了全新的优化,使得之前软件IIC几百行代码,HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处 这可能是目前关于STM32CubeMX...AT24CXX EEPROM Board模块中默认为接地。所以A2~A0默认为000,最后一位表示读写操作。所以AT24Cxx的地址为0xA1,地址为0xA0。...所以,当我们多个字节时,写入一个字节之后,再写入下一个字节之前,必须延时5ms才可以 从AT24C02中读数据 1,当前地址的数据 2、随机地址的数据 MCU先发送一个开始信号...(START)启动总线 接着跟上首字节,发送器件操作地址(DEVICE ADDRESS)+数据(0xA0) 注意:这里操作是为了要把所要的数据的存储地址先写进去,告诉E2PROM要读取哪个地址的数据...Mem_Write是2个地址,Master_Transmit只有从机地址 硬件IIC读取AT24C02 mian.c文件前面声明,AT24C02 地址和地址 ,定义数据数组,和读数据数组 /

    3.6K31

    ESP8266开发-Arduino IDE安装、配置与使用

    的编程风格,此方式需要先给板子烧一个特殊的固件 因为我之前玩过Arduino,而且Arduino编程简单易操作,所以就选择先使用Arduino IDE来玩一玩ESP8266。...安装完之后,打开,可以看到我的软件里已经有了Arduino AVR和ESP8266的开发环境(注:ESP8266的开发环境是我旧版本的Arduino IDE中安装过,安装新版本IDE后,之前的配置也会自动加载进来...2 卸载ESP8266开发包(可选) 因为我之前安装过2.6.3版本的ESP8266,那我就先卸载掉,再安装一个更新版本(3.0.1)的ESP8266安装包。...卸载ESP8266安装包 文件管理器地址栏输入 %LOCALAPPDATA%/Arduino15/packages,回车进入,然后删除掉其中的esp8266文件夹即可卸载 3 安装ESP8266...此外,还可以将自己的一些初始化函数放到setup函数中,用于程序开机时初始化,比如我们自己的WIFI初始化函数:initWiFi()。

    2.3K10

    STM8S——Flash program memory and data EEPROM

    在这里我们只简单的讲解如何对STM8S内部的数据存储区域(data memory)进行操作、操作、擦除操作。...所以我们的操作是DATA MEMORY里面,该区域的指定地址进行读取内容、写入内容、擦除内容。...3、操作方法 (1)FLASH_ReadByte( ADDRESS ):读取地址ADDRESS处的1字节内容 (2)FLASH_ProgramByte( ADDRESS , DATA ):1字节的内容到地址...; 说明:UBC和DATA MEMORY都有写保护,其中UBC的写保护是永远无法解锁的,而DATA MEMORY的写保护是可以通过连续写入两个MASS密钥来解除该区域的写保护的;第一个密钥为0x56,...第二个密钥为0xAE;只有当两个密钥输入正确(输入到寄存器FLASH_DUKR中)且输入密钥的先后顺序正确时,才会解除写保护;否则该区域在下一次系统复位之前都将一直保持写保护状态。

    1.8K10

    认识MySQL和Redis的数据一致性问题

    时间 线程A 线程B 潜在问题 T1 更新数据库中的数据X T2 读取数据X,命中缓存,从缓存中读取X,读取 线程A尚未删除缓存,导致线程B读到 T3 删除缓存的数据X 或者,”...(从库 X = 1) T4 将写入缓存(X = 1) T5 从库同步完成(主从库 X = 2) 最终 X 的缓存中是 1(),主从库中是 2(新),也发生不一致 解决方案...,后续的请求会命中缓存得到最新 这种场景下,线程A未更新完缓存之前,在这期间的请求会短暂读到,对业务短暂影响 先更新缓存,再更新数据库 +并发 1.线程A先更新缓存成功 2.线程B读取数据...+ 线程A未更新完缓存之前,线程B的请求会短暂读到 请求从短暂缓存读到数据 保存读取记录,做补偿 + 更新数据库的顺序是先A后B,但更新缓存时顺序是先B后A 数据库和缓存数据不一致...分布式锁 先更新缓存,再更新数据库 无 缓存更新成功,但更新数据库失败 数据库存在 重试数据库更新 + 线程A还未更新完数据库,但在这之前进来的请求都能直接命中缓存,获取到最新 数据库与缓存存在短暂不一致

    4.7K52

    4.5 51单片机-DS18B20温度传感器

    第 1、 2 个字节是温度转换后的数据信息,第 3、 4 个字节是用户 EEPROM(常用于温度报警储存)的镜像。在上电复位时其将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。...(3) EEPROM非易失性记忆体:用于存放长期需要保存的数据。比如: 上下限温度报警和校验数据,DS18B20共有3个字节的EEPROM,并在 RAM 都存在镜像,以方便用户操作。...如果接下来发送的数据是0,那么需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间15~60us内;采样时间内,如果总线为低电平,则表示0,如果总线为高电平,则表示1。...如果接下来发送的数据是1,那么也需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间15~60us内;采样时间内,如果总线为低电平,则表示0,如果总线为高电平,则表示1。...注意: 通信时,是以一个字节为单位向DS18B20进行传输,字节的或者是从低位开始的。

    1.1K21

    调试又踩了个坑,SPI从机没反应

    逻辑 总结起来就是,的时候包含一位低,一位读写控制位,为高, 为低,6位寄存器地址位,8位数据,如果是16位帧格式就完了, 如果是20位帧格式,末尾还需加上4位CRC校验。...至于代码的实现,可以采用SPI查询模式,也可以采用中断或者DMA方式,这个都可以,一定要注意一个16位的数据要通过两次操作才能完成, 逻辑 操作总结起来就是一句话,按照格式同样的内容发两遍这样第二遍才能获取结果...代码实现上也是这样操作,包含一位低,一位读写控制位,为高, 为低,6位寄存器地址位,8位数据。按照书册要求,结合SDK可以很容易的完成驱动的开发和使用,重点在调试。...测试 按照手册要求完成了驱动开发,可是通讯的时候,A1333没有反应,用示波器测到的波形如下 发送的数据和时钟波形都是正确的,可是A1333从机没有反应,读取到的全是0, 是有问题的,应检查软件代码和硬件排查问题...,但是操作前需要解锁,而解锁是需要特殊密码指令的, 就是连续发送这5条指令,然后读取0x3C寄存器,按照解锁指令和时序发送完指令后,可以读取0x3C地址,如果 寄存器的最低位 bit0 如果返回为

    1.9K50

    Linux应用开发【第十二章】I2C编程应用开发

    引脚输出信号的同时还作用输入信号供内部进行检测,当输出与输入不一致时,就表示有问题发生了。这为 “时钟同步”和“总线仲裁”提供硬件基础。 ​...安装命令为:make install,如果你想要让最后生成的二进制文件最小的话,可以“make install”之前运行“make strip”。...-r 写入之后立即读取它,并将结果与写入的进行比较。 -y 取消交互模式。默认情况下,i2cdetect将等待用户的确认,当使用此标志时,它将直接执行操作。 -V 显示I2C工具的版本并推出。...掩码中设置为1的位将从中取出,而设置为0的位将从数据地址中读取,从而由操作保存。...它将打印所有信息发送,即不仅为消息,也为消息。 -V 显示I2C工具的版本并推出。 -a 允许0x00 - 0x02和0x78 - 0x7f之间使用地址。一般不推荐。

    3.6K31

    EEPROM的详细分析

    本例的EEPROM型号为AT24CM01,电路中的引脚连接如下图所示: ? 1,该器件的特性如下: 时钟支持标准模式(100KHZ),快速模式(400KHZ),极快速模式(1MHz)。...该EEPROM的器件地址定义如下: 地址的高4位是预定义好的,为"1010",bit3,bit2根据引脚A2,A1连接的电平来决定,该设计中,A2,A1均为0,bit1位为寄存器地址的最高位(A16...时为0,时为1。 ? 该EEPROM的的寄存器地址为双字节,定义如下 ? ? 首先发送寄存器地址的高8位字节地址,然后发送寄存器地址的低8位字节地址。...非应答信号(NAK):连续读数据时,当读取完最后一个字节数据时,从机不产生响应信号。...该器件支持3中模式的操作: 当前地址, 随机地址, 顺序读取。 1,当前地址 内部数据字地址计数器保存上次操作期间访问的最后一个地址上增加一个地址。只要保持电源,此地址一直有效。

    1.3K40

    源码系列:基于FPGA的 IIC 设计(附源工程)

    控制字 我们的控制字为 1010_0000,其中 1010 为 EEPROM 的型号标识,为一组固定的序列,紧接着 A2,A1,A0 就是我们的片选信号,最后一位为读写控制位,低电平代表,高电平代表...说明:由于 IIC 总线协议启动和停止信号都是 SCL 高电平期间发生跳变,这就决定了我们其他数据的改变只能发生在 SCL 低电平期间, SCL 为高电平期间,数据必须保持稳定。...设计架构 本设计用两个按键控制 EEPROM 读写,当按键按下时,向 EEPROM 某一固定地址写入一个字节数据,当按键按下时,将该地址数据读出,并显示到数码管,LED 灯是一个标志信号,LED 亮说明数据写入完毕...eeprom_scl))//scl低电平期间,完成并串转换,发出控制字 begin counter<=counter+1'...eeprom_scl))//scl低电平期间,完成并串转换,发出控制字 begin counter<=counter+1'

    1.2K11
    领券