題:
如何在ESP8266中讀寫EEPROM
Embedded Geek
2016-07-02 23:18:40 UTC
view on stackexchange narkive permalink

我需要知道如何在EEPROM中寫入整數值並在通電時保留該值。

  char * Red = strstr(myTestUrl ,“ / R”); if(Red){int RedValue = atoi(Red + 2); AnalogWrite(12,RedValue); Serial.println(“ Red:”); Serial.println(RedValue);}  

我想在EEPROM中寫入 RedValue 。怎麼辦?

查看將ESP8266支持添加到Arduino時安裝的EEPROM示例草圖
詢問使用EEPROM是否有任何閃存依賴性。我可以以1 MB的速度閃爍(沒有SPIFFS)並可以訪問EEPROM嗎?謝謝T
五 答案:
codechimp
2017-12-19 01:47:21 UTC
view on stackexchange narkive permalink

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的本地字節陣列緩存。它還具有其他功能。

您保存了我的一天,我正在尋找五個多小時的解決方案,而您給了它!
這裡確實缺少實際的Arduino文檔,並且資源也沒有幫助。是否仍然需要EEPROM.end()?為什麼需要begin(512)?加上get()/ put()組合或使用update()有助於防止EEPROM磨損。也許您可以更新答案。
我為NodeMCU v3進行了此精確代碼的複制/粘貼,並且在重新上電後它沒有檢索寫入的值(我註釋掉“第二次運行的寫入部分”)。
@WhiskerBiscuit,在串行控制台中看到任何輸出嗎?您確定波特率設置正確嗎?我沒有v3,只有v0.9,所以如果這是前向兼容性問題,就無濟於事。
從引用“ EEPROM.write不會立即寫入閃存,相反,每當您希望將更改保存到閃存時,都必須調用EEPROM.commit()。EEPROM.end()也將提交,並將釋放EEPROM內容的RAM副本。 ”
我實際上已經了解到,至少在esp8266上,EEPROM.commit()是絕對必要的,以便EEPROM數據在重新啟動後仍能正常運行。
user31481
2017-07-04 05:12:28 UTC
view on stackexchange narkive permalink

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是永久的。您無需執行任何操作。

我做了一些搜索,看來EEPROM可以比閃存存儲處理更多的寫週期,但是閃存還具有一個控制器,可以停止使用壞區並繼續使用其餘工作區。
由於生命週期警報而被推薦。有人說10萬個週期。
360
2018-01-05 07:37:22 UTC
view on stackexchange narkive permalink

使用字母數的方法。

  #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));返回緩衝區;}  
Embedded Geek
2017-03-04 23:37:31 UTC
view on stackexchange narkive permalink

使用 #include <EEPROM.h>

  EEPROM.begin(size); //大小可以在4到4096字節之間的任何地方。EEPROM.write(0,RedValue); //存儲在第0個位置EEPROM.commit();  
PeterM
2017-12-30 05:57:56 UTC
view on stackexchange narkive permalink

我在ESP8266的代碼中使用了2個單獨的函數-一個帶有 EEPROM.put(),一個帶有 EEPROM.get()

我只有在 EEPROM.put()函數中使用了 EEPROM.begin(sizeof ...); ,而 put 起作用了,但這花了我相當一段時間後,直到我發現,它也必須在 EEPROM.get()之前使用。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...