使用esp8266在blinker下eeprom读写BUG
使用esp8266在blinker下eeprom读写BUG除4095地址,也试过2500-4095很多个地址写入后, 重新读取都是0。应该是Blinker 的一个BUG,不用Blinker可以正常写入和读取。void setup(){//省略其他初始化没复制上来。。。。。。。。。。。。。。。。。。。。。。。
EEPROM.begin(4096); //开启EEPROM,开辟1024个位空间 Setpoint = EEPROM.read(4095) ; //将EEPROM.read(0)的值赋予Setpoint
}
void EEPROM_Save()
{
if ( (millis() / 1000 - EEPROM_Save_time) >= 3 ) //每3秒检查写入一次数据:
{
EEPROM_Save_time = millis() / 1000;
byte arom = EEPROM.read(4095) ;
byte bbb = Setpoint;
if ( bbb == arom ) //判断设置的温度是否和存储的数值相等
{
Serial.println("The same");
} else if( bbb != arom )
{
byte ccc =Setpoint;
EEPROM.write(4095,ccc); //给EEPROM 第X位,写入ccc的值
EEPROM.commit(); //将数据保存到EEPROM
EEPROM.end(); //写入flash,并且释放内存空间
byte aaa = EEPROM.read(4095) ;
Serial.print("EEPROM:");
Serial.println(aaa);
Serial.println(ccc);
}
}
}
void loop()
{
Blinker.run(); //运行Blinker
EEPROM_Save();
}
已经避开以下地址:ESP8266&ESP32EEPROMESP-Arduino SDK 中 EEPROM 是使用 Flash 模拟的, 以下EEPROM地址在 blinker 库中已占用, 用户开发时务必避开以下地址。
地址用途
0-1279自动化控制数据
1280-1535专属设备数据
1536-2431定时器配置数据
2432-2435ESP AT模块串口配置数据
2436-2447OTA配置数据
串口打印内容:
The same
The same
EEPROM:0
255
EEPROM:0
255
EEPROM:0
255
EEPROM:0
255
EEPROM:0
255
EEPROM:0
255
知道问题原因了,和blinker无关,是EEPROM.begin(4096); EEPROM.end(); 每次都需要使用才能写入和读取 嘻嘻,没问题!你从100地址开始读写
/*可以通过 col.a 访问这个共用体中的 float 类型成员 a,也可以通过 col.b 访问这个共用体中的 byte 类型成员 b。col.a 和 col.b 共同占用四个字节的地址。给 col.a 赋值后,通过 col.b 即可拆分 float 为4个字节。 */
//创建一个data共用体结构,用于EEPROM读取和保存float、int 4字节的数据类型 ; 这两个类型的变量都是占用4个字节,且是相同的4个字节,所以能始终保持数据一致,其中一个变了,另一个也随之改变。//
union data
{
float a;// 浮点型,占用4个字节
byte b;// 字节型数组,占用4个字节。
// 这两个类型的变量都是占用4个字节,且是相同的4个字节,所以能始终保持数据一致,其中一个变了,另一个也随之改变。
};
data col;//声明一个data类型的变量col
// EEPROM写入float 4个字节数据类型的函数;函数(float z)改成(int z)可以换成存储int类型; z 为要写入的数值, x为要写入的数值位置编号
void EEPROM_Write_4byte1(float z , int x)
{
x = x * 4;
col.a = z; // 使用data共用体col通过 col.a 赋值 col.b
EEPROM.begin(4096); // EEPROM.begin(4096);EEPROM.end();每次都需要使用才能写入和读取
for (int i = 0; i < 4; i++)
{
EEPROM.write(i+3000+x, col.b); // 通过 b 拆分为4个字节 ,从i+3000+x位后开始写入
}
EEPROM.end();
//Serial.println("EEPROM: Write_4byte1 successful");
}
// EEPROM读取 float 4个字节数据类型的函数; 函数:float EEPROM_Read_4byte1(float z)改成int EEPROM_Read_4byte1(int z)可以换成读取int类型
float EEPROM_Read_4byte1(float z)
{
z = z * 4;
EEPROM.begin(4096); // EEPROM.begin(4096);EEPROM.end();每次都需要使用才能写入和读取
for (int i = 0; i < 4; i++)
{
col.b=EEPROM.read(i+3000+z); // 读取EEPROM.read(i+3000+z)的数据给 col.b ,再传导给col.a
}
EEPROM.end();
z = col.a ;
//Serial.print("EEPROM:Write_4byte1:");
//Serial.println(z);
return z;
}
函数使用方法:
EEPROM_Write_4byte1( 3.456789, 1 ); // EEPROM_Write_4byte1( a , b ); a为需要写入保存的数值,b为写入数值的位置 ( b 默认从3000位开始写入每4位保存一个float数值)
float jj = EEPROM_Read_4byte1( 1 ) ; // EEPROM_Read_4byte1( 1 ); 读取位于1的数值。
页:
[1]