物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例

查詢了很多資料,反覆嘗試總出現各種錯誤。目前針對結構體參數存儲數據到EEPROM進行了嘗試和總結,以便學習使用。

廢話少說:直接代碼並註解!【首發於頭條,轉發於此,更多資源關注,久愛物聯網】

重點

1、寫要提交,方法不能遺漏!EEPROM.end();或EEPROM.commit();必具其一,建議前者

2、內存空間申請大小必須大於結構體數據長度(4的倍數) 如:EEPROM.begin(128);

3、存儲地址不能重疊,且有效利用!!寸土是金!上一數據地址+1開始

//引用頭文件
#include <EEPROM.h>
//定義一個寫和讀的通用方法
#define EEPROM_write(address,p) { int i = 0;byte *pp = (byte*)&(p);for(;i<sizeof(p);i++) EEPROM.write(address+i,pp[i]);EEPROM.end();}
#define EEPROM_read(address,p) { int i = 0;byte *pp = (byte*)&(p);for(;i<sizeof(p);i++) pp[i]=EEPROM.read(address+i);}
//注意事項 寫的結尾一定要有EEPROM.end();或EEPROM.commit();目的就是提交保存操作否則不保存成功

//測試2個結構體不同的存儲地地址
struct config_type
{//sizeof(config_type)=72
  int date1;
  float date2;
  char date3[64];
}cfgtype;//聲明別名cfgtype
//結構體2
struct config_jiuai
{//sizeof(config_jiuai)=128
  char jiuai[128];
}cfgjiuai;//聲明別名cfgjiuai

void eeprom_test() {
  Serial.println(sizeof(cfgtype));//72
  cfgtype.date1 = 6266;
  cfgtype.date2 = 3.14;
  strcpy(cfgtype.date3, "{\"fuwuhao\":\"jiuaiiot\",\"tel\":\"180***77\"}");// 標準json字符串;賦值方法strcpy() 
  EEPROM.begin(128);//申請內存空間
  EEPROM_write(0, cfgtype);  //寫入到0地址的結構體變量
  //-------結構體1寫結束-------------
  EEPROM.begin(256);//申請空間必須大於結構體長度,4的倍數
  sprintf(cfgjiuai.jiuai,"{\"tel\":\"%s\",\"mode\":%d,\"automode\":%d}","180***66",1,0);
  //賦值方法 標準json格式
  Serial.println(sizeof(cfgjiuai));
  EEPROM_write(129, cfgjiuai);//寫地址128+1 結構體2
  //EEPROM.commit();  //上方法中提交
  Serial.println("write ok!");
  //-----------結構體1讀------------
  config_type readback;//結構體變量(讀)
  EEPROM.begin(128);//申請內存空間
  EEPROM_read(0, readback);  //從地址0讀取數據
  Serial.print("data1:");
  Serial.println(readback.date1);//打印數據1
  Serial.print("data2:");
  Serial.println(readback.date2);
  Serial.print("data3:");
  Serial.println(readback.date3);//打印數據3
  //------------結構體2讀----------------
  EEPROM.begin(256);//申請空間
  config_jiuai jiuai1;//申請變量
  EEPROM_read(129, jiuai1);//讀數據
  Serial.print("jiuai:");
  Serial.println(jiuai1.jiuai);//打印數據
  
  Serial.println("read eeprom over!");
}

void setup() {
  Serial.begin(9600);//波特率9600和115200均可
  eeprom_test();//讀和寫
}

void loop() {
  //歡迎關注 訂閱,學習開發板即將發佈!
}

學習2種賦值方法:strcpy()  和 sprintf() 

物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例

更多學習實踐,全部實踐後的總結。更多精彩敬請關注!!有驚喜哦

物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例

 物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例

物聯網開發Arduino_EEPROM_Esp8266斷電存儲實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章