作者: ken

ESP8266 使用 LittleFS/SPIFFS 儲存與載入 變數/參數/資料

No Comments
  • 首先,當然必須了解 LittleFS/SPIFFS 於 ESP8266 平台上的基本使用方式。請參考前面相關文章。
  • 當我們知道如何在 ESP8266 flash 上的 FS 區建立/讀/寫檔案後很可能就會有更進一步的應用與所求。例如,我讓程式經過學習後,得到一組參數得以讓主程式更好地作動,若不儲存,斷電後下次重啟不是又要再重新學習一次?所以當然就需將參數儲存下來至檔案內/flash 內。然而,把一堆參數寫入檔案,甚至於某些變數的數值,資料內容等給全部儲存下來,其似乎簡單,就儲存而已。但,要載入呢?回存那些特定的資料參數變數到原來它該屬的地方呢?嗯,是個問題了。
  • 這問題牽扯到如何安排檔案內的資料單元的排列存放方式以至於後續可唯一性地索引到它及將它載入至變數/記憶體中。
  • 當然,如本文標題,這樣的函式庫就不得不寫出來了。
  • 當然,這樣的函式庫網路也不少,但筆者自己就懶得去找/看/學怎麼用。不過也是花了幾天才寫出來,因卡關:
  • LittleFS/SPIFFS 的 find() 函式是源於 stream 類別,其只接受 char 的資料型別。所以,檔案中若是 char 和 binary 資料混合夾雜共存,那麼 find() 就會失效。簡單講,使用既有的 LittleFS/SPIFFS 函式庫,將只適用於純 char/ascii 檔案。故,最終,筆者只能自製 find() 函式,以能在一般的檔案(binary 檔案)中游刃。
  • 如何使用此函式庫,請直接看 code 的內容及主程式,相信不難明白。最少,WriteWords(),ReadWords(),就已滿足一般使用了。
  • 對了,自製的 find() 函式,是使用特殊香料製成。效率很可能更差,但就僅僅只是風味不同而已。
  • 還有本函式庫僅是初步,很可能有 bug,而或許還可趁盛加入些更便利的函式但算了,已滿足筆者使用了就先止步了。

以下貼出主程式及執行結果,以讓腦中有點畫面。
主程式:


    double THE_PI=3.1415926f;
    cDataBase s;
    s="/database";
    s.Open();

    s.WriteWords("abcd", 4567, 1111.2f);
    s.WriteWords("defg", 7654, 6666);
    s.WriteBytes("1234", 0, "abcdefghijklm", 13);
    s.FindStart();
    printf("[%d %d %d]\r\n", s.FindNext("abcd"), s.FindNext("defg"), s.FindNext("1234"));
    s.DumpAll(1);

    s.WriteWords("doubleTHE_PI", 0, THE_PI);
    s.WriteWords("abcd", 4567, 1111.2f);
    s.WriteWords("fg", 7654, 6666);
    s.WriteBytes("dcba", 2, "abcdefghijklm", 13);
    s.WriteWords("dcba", 4567, 100000.f*100000.f*100000.f);
    s.WriteWords("gd", 1111, 6666);
    s.WriteBytes("eeeeee", 2, "abcdghijklm", 11);

    float L1, L4;
    int I1, I2, I3, I4, I5, I6;
    char C3[14]={0}, C6[12]={0};

    if (s.ReadWords(L4, "dcba", 4567)) printf("dcba[L4 %f]\r\n", L4);
    if (s.ReadBytesNext(C3, 13, I3, "dcba")) printf("dcba[I3a %d, %s]\r\n", I3, C3);

    L4=I4=I3=0;
    if (s.ReadBytes(C3, 13, I3, "dcba")) printf("dcba[I3b %d, %s]\r\n", I3, C3);
    if (s.ReadWordsNext(L4, I4, "dcba")) printf("dcba[L4 %d %f]\r\n", I4, L4);
    if (s.ReadBytesNext(C6, 11, "eeeeee", 1)) printf("eeeeee[C6a %s]\r\n", C6);
    if (s.ReadBytes(C6, 11, "eeeeee", 2)) printf("eeeeee[C6b %s]\r\n", C6);

    if (s.ReadWords(L1, I1, "dcba")) printf("abcd1[%d, %f]\r\n", I1, L1);
    if (s.ReadWords(L1, I1, "abcd")) printf("abcd2[%d, %f]\r\n", I1, L1);

    s.DumpAll(0);

    THE_PI=0;
    if (s.ReadWords(THE_PI, "doubleTHE_PI")) printf("\r\nvariable THE_PI[%f]\r\n", THE_PI);

    s.Close();
    dirRoot();

執行結果:

21:38:19.551 -> filesystem formatted.
21:38:19.551 -> --------
21:38:19.551 -> The FileSystem:
21:38:19.551 -> entire space 2072576 bytes
21:38:19.551 -> 16384 bytes used
21:38:19.551 -> free space 2056192 bytes
21:38:19.551 -> block size 8192 bytes
21:38:19.551 -> page size 256 blocks
21:38:19.551 -> --------
21:38:19.551 -> list root directory "/":
21:38:19.650 -> [20 48 76]
21:38:19.650 -> [AA 5A A5 55 04 00 00 00 ]
21:38:19.650 -> [8A 01 00 00 0C 00 00 00 ]
21:38:19.650 -> [61 62 63 64 D7 11 00 00 ]
21:38:19.650 -> [66 E6 8A 44 AA 5A A5 55 ]
21:38:19.650 -> [04 00 00 00 96 01 00 00 ]
21:38:19.650 -> [0C 00 00 00 64 65 66 67 ]
21:38:19.650 -> [E6 1D 00 00 0A 1A 00 00 ]
21:38:19.650 -> [AA 5A A5 55 04 00 00 00 ]
21:38:19.650 -> [CA 00 00 00 15 00 00 00 ]
21:38:19.650 -> [31 32 33 34 00 00 00 00 ]
21:38:19.650 -> [61 62 63 64 65 66 67 68 ]
21:38:19.650 -> [69 6A 6B 6C 6D ]
21:38:19.749 -> dcba[L4 999999986991104.000000]
21:38:19.749 -> dcba[I3b 2, abcdefghijklm]
21:38:19.749 -> dcba[L4 4567 999999986991104.000000]
21:38:19.749 -> eeeeee[C6b abcdghijklm]
21:38:19.749 -> abcd1[2, 16777999408082104352768.000000]
21:38:19.749 -> abcd2[4567, 1111.199951]
21:38:19.749 -> [ .  Z  .  U  .  .  .  . ]
21:38:19.749 -> [ .  .  .  .  .  .  .  . ]
21:38:19.749 -> [ a  b  c  d  .  .  .  . ]
21:38:19.782 -> [ f  .  .  D  .  Z  .  U ]
21:38:19.782 -> [ .  .  .  .  .  .  .  . ]
21:38:19.782 -> [ .  .  .  .  d  e  f  g ]
21:38:19.782 -> [ .  .  .  .  .  .  .  . ]
21:38:19.782 -> [ .  Z  .  U  .  .  .  . ]
21:38:19.782 -> [ .  .  .  .  .  .  .  . ]
21:38:19.782 -> [ 1  2  3  4  .  .  .  . ]
21:38:19.782 -> [ a  b  c  d  e  f  g  h ]
21:38:19.782 -> [ i  j  k  l  m  .  Z  . ]
21:38:19.782 -> [ U  .  .  .  .  T  .  . ]
21:38:19.782 -> [ .  .  .  .  .  d  o  u ]
21:38:19.782 -> [ b  l  e  T  H  E  _  P ]
21:38:19.782 -> [ I  .  .  .  .  .  .  . ]
21:38:19.815 -> [ @  .  !  .  @  .  Z  . ]
21:38:19.815 -> [ U  .  .  .  .  .  .  . ]
21:38:19.815 -> [ .  .  .  .  .  a  b  c ]
21:38:19.815 -> [ d  .  .  .  .  f  .  . ]
21:38:19.815 -> [ D  .  Z  .  U  .  .  . ]
21:38:19.815 -> [ .  .  .  .  .  .  .  . ]
21:38:19.815 -> [ .  f  g  .  .  .  .  . ]
21:38:19.815 -> [ .  .  .  .  Z  .  U  . ]
21:38:19.815 -> [ .  .  .  .  .  .  .  . ]
21:38:19.815 -> [ .  .  .  d  c  b  a  . ]
21:38:19.815 -> [ .  .  .  a  b  c  d  e ]
21:38:19.815 -> [ f  g  h  i  j  k  l  m ]
21:38:19.815 -> [ .  Z  .  U  .  .  .  . ]
21:38:19.848 -> [ .  .  .  .  .  .  .  . ]
21:38:19.848 -> [ d  c  b  a  .  .  .  . ]
21:38:19.848 -> [ .  _  c  X  .  Z  .  U ]
21:38:19.848 -> [ .  .  .  .  .  .  .  . ]
21:38:19.848 -> [ .  .  .  .  g  d  W  . ]
21:38:19.848 -> [ .  .  .  .  .  .  .  Z ]
21:38:19.848 -> [ .  U  .  .  .  .  ^  . ]
21:38:19.848 -> [ .  .  .  .  .  .  e  e ]
21:38:19.848 -> [ e  e  e  e  .  .  .  . ]
21:38:19.848 -> [ a  b  c  d  g  h  i  j ]
21:38:19.848 -> [ k  l  m ]
21:38:19.848 -> 
21:38:19.848 -> variable THE_PI[3.141593]
21:38:19.848 -> list root directory "/":
21:38:19.848 -> database    315 bytes

20210320 更新

隔一天筆者就自己打臉自己,程式做了更新,為 0.1 版。其適用層面更大了,內詳。

20210321 更新

更新成 0.2 版,修正一隻 bug。並新增展示主程式使得更清楚用法。
可能還會更新,例如使用萬用字元撈出相同 ID 者,只是單星號而已;若搜部份字串就太難為我了。

20210323 更新

再次改版。已沒想到還有什麼要增刪修的。故應是最後一版。而 RTTI 筆者程度還不到那並且程式上也可能更複雜化,故應是不會使用。

20210402 更新

修正一隻 bug。並改成 lib form 及其範例。

20210406 update v.0.5

20210523 update v.0.6,v.0.6a

PHP Code Snippets Powered By : XYZScripts.com