我需要知道如何在EEPROM中寫入整數值並在通電時保留該值。
char * Red = strstr(myTestUrl ,“ / R”); if(Red){int RedValue = atoi(Red + 2); AnalogWrite(12,RedValue); Serial.println(“ Red:”); Serial.println(RedValue);}
我想在EEPROM中寫入 RedValue
。怎麼辦?
我需要知道如何在EEPROM中寫入整數值並在通電時保留該值。
char * Red = strstr(myTestUrl ,“ / R”); if(Red){int RedValue = atoi(Red + 2); AnalogWrite(12,RedValue); Serial.println(“ Red:”); Serial.println(RedValue);}
我想在EEPROM中寫入 RedValue
。怎麼辦?
EEPROM.read
和 EEPROM.write
是有效的方法,就像用牙刷擦地板一樣。改用 EEPROM.put
和 EEPROM.get
。
例如:
#include <EEPROM.h>void setup(){Serial.begin(9600); uint addr = 0; //偽造的數據結構{uint val = 0; char str [20] =“”; }數據; //提交512字節的ESP8266 flash(用於“ EEPROM”仿真)//此步驟實際上將flash的內容(512字節)加載到// RAM EEPROM中的512字節數組緩存中。begin(512); //讀取字節(即“ EEPROM”中的sizeof(data)),//實際上是從字節數組緩存中讀取//將字節轉換為稱為數據EEPROM的結構。get(addr,data); Serial.println(“舊值是:” + String(data.val)+“,” + String(data.str)); //處理從EEPROM數據“讀取”的數據。val+ = 5; if(strcmp(data.str,“ hello”)== 0)strncpy(data.str,“ jerry”,20);否則strncpy(data.str,“ hello”,20); //用修改後的數據替換字節數組緩存中的值//不對閃存進行任何更改,全部都在本地字節數組緩存中EEPROM.put(addr,data); //實際上將字節數組緩存的內容寫入硬件閃存。當且僅當更改了字節數組緩存中的一個或多個字節//時,才會發生flash寫操作;但是,如果這樣,將所有512個字節// //寫入flash EEPROM.commit();。 //清除“數據”結構data.val = 0; strncpy(data.str,“”,20); //重新加載EEPROM的數據,請參見更改// OOPS,不是實際讀取閃存,而是讀取字節陣列緩存(在RAM中),//重啟ESP8266才能真正看到閃存/“ EEPROM”更新了EEPROM.get(addr ,數據); Serial.println(“新值是:” + String(data.val)+“,” + String(data.str));}無效循環(){delay(1000);}
更新:如果您想了解ESP8266中“ EEPROM”的仿真方式,您可能想參考 https://github.com/esp8266/Arduino/tree/ master / libraries / EEPROM,特別是 EEPROM.h
。
也不需要 EEPROM.end
,它只是清除了來自RAM的閃存/ EEPROM的本地字節陣列緩存。它還具有其他功能。
EEPROM.write(pos,val)
在 pos
給定的地址寫入一個字節( val
)。 ESP8266中的“ int”佔用4個字節,因此稍微複雜一點,因為EEPROM以字節為單位工作,而不是int。 EEPROM中的某些位置 pos
:
void eeWriteInt(int pos,int val){字節* p =(字節*)&val; EEPROM.write(pos,* p); EEPROM.write(pos + 1,*(p + 1)); EEPROM.write(pos + 2,*(p + 2)); EEPROM.write(pos + 3,*(p + 3)); EEPROM.commit();}
,當然,您需要讀回它:
int eeGetInt(int pos){int val;字節* p =(字節*)&val; * p = EEPROM.read(pos); *(p + 1)= EEPROM.read(pos + 1); *(p + 2)= EEPROM。讀(pos + 2); *(p + 3)= EEPROM.read(pos + 3); return val;}
在Arduino中,您調用 EEPROM.begin()
,但在ESP8266中,您必須調用 EEPROM.begin(n)
,其中 n
是您需要的字節總數。
請記住,EEPROM的壽命很短(按寫入次數計算)。您必須將寫入次數減到最少!
EEPROM是永久的。您無需執行任何操作。
使用字母數的方法。
#include <ESP8266WiFi.h>const char * SSID =“ R360”; // MAX 32const char * PASSWORD =“ HFDYUK64323246”; // MAX 32#include <EEPROM.h>void setup(){Serial.begin(9600); EEPROM_ESP8266_GRABAR(SSID,0); // Primero de 0 al 32,del 32 al 64,等等EEPROM_ESP8266_GRABAR(PASSWORD,32); //保存Serial.println(); Serial.println(EEPROM_ESP8266_LEER(0,32)); // Primero de 0 al 32,del 32 al 64,etc Serial.println(EEPROM_ESP8266_LEER(32,64)); WiFi.begin(EEPROM_ESP8266_LEER(0,32).c_str(),EEPROM_ESP8266_LEER(32,64).c_str());} // void loop(){} // void EEPROM_ESP8266_GRABAR(String buffer,int N){EEPROM。開始(512);延遲(10); for(int L = 0; L < 32; ++ L){EEPROM.write(N + L,buffer [L]); } .EEPROM.commit();} //字符串EEPROM_ESP8266_LEER(int min,int max){EEPROM.begin(512);延遲(10);字符串緩衝區;對於(int L =最小值; L <最大值; ++ L)如果(isAlphaNumeric(EEPROM.read(L)))緩衝區+ = char(EEPROM.read(L));返回緩衝區;}
使用 #include <EEPROM.h>
EEPROM.begin(size); //大小可以在4到4096字節之間的任何地方。EEPROM.write(0,RedValue); //存儲在第0個位置EEPROM.commit();
我在ESP8266的代碼中使用了2個單獨的函數-一個帶有 EEPROM.put()
,一個帶有 EEPROM.get()
。
我只有在 EEPROM.put()
函數中使用了 EEPROM.begin(sizeof ...);
,而 put
起作用了,但這花了我相當一段時間後,直到我發現,它也必須在 EEPROM.get()
之前使用。