使用esp8266在blinker下eeprom读写BUG-Arduino中文社区 - Powered by Discuz! Archiver

jianfengbeyond 发表于 2020-11-3 17:42

使用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





jianfengbeyond 发表于 2020-11-3 18:06

知道问题原因了,和blinker无关,是EEPROM.begin(4096); EEPROM.end(); 每次都需要使用才能写入和读取

sting2k1 发表于 2020-11-15 15:21

嘻嘻,没问题!你从100地址开始读写

jianfengbeyond 发表于 2020-12-14 15:07


/*可以通过 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]
查看完整版本: 使用esp8266在blinker下eeprom读写BUG