查詢了很多資料,反覆嘗試總出現各種錯誤。目前針對結構體參數存儲數據到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()
更多學習實踐,全部實踐後的總結。更多精彩敬請關注!!有驚喜哦