簡體   English   中英

如何將 EEPROM.put 和 EEPROM.get 封裝在自己的函數中(Arduino / C / ESP8266)?

[英]How to encapsulate EEPROM.put and EEPROM.get in own functions (Arduino / C / ESP8266)?

我想將 Arduino 函數 EEPROM.put 和 EEPROM.write 的用法封裝在另一個 function 中(它也開始和結束與 EEPROM 的通信),所以我創建了這兩個函數:

void eeprom_save(uint addr, uint8_t *data, uint len) {
  EEPROM.begin(len);
  EEPROM.put(addr, *data);
  EEPROM.commit();
  EEPROM.end();
}

void eeprom_load(uint addr, uint8_t *data, uint len) {
  EEPROM.begin(len);
  EEPROM.get(addr, *data);
  EEPROM.end();
}

我這樣調用函數:

uint8_t scale_data[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
eeprom_save(0, scale_data, sizeof(scale_data));
// ... here is some code to clear the scale_data, to read back from EEPROM ...
eeprom_load(0, scale_data, sizeof(scale_data));

據我分析,它將值正確保存到 EEPROM,但用我的 function eeprom_load 讀取 EEPROM 不起作用(僅返回 0、0、0、0、0,...)

PS:我正在使用 ESP8266 Cores EEPROM implementation

我想我在理解使用的指針時遇到了一些麻煩?

如何解決這個問題?

恕我直言,class 無法處理 arrays(已衰減為指針)。 所以你需要使用一個循環:

void eeprom_save(uint addr, uint8_t *data, uint len) {
  EEPROM.begin(len);
  for (uint i = 0; i < len; i++) {
    EEPROM.put(addr + i, data[i]);
  }
  EEPROM.commit();
  EEPROM.end();
}

void eeprom_load(uint addr, uint8_t *data, uint len) {
  EEPROM.begin(len);
  for (uint i = 0; i < len; i++) {
    EEPROM.get(addr + i, data[i]);
  }
  EEPROM.end();
}

另一種選擇是擴展 class 以處理 arrays。 這是未經測試的,我以前從未使用過 class,但我認為它應該可以工作。

class MyEEPROMClass : public EEPROMClass {
public:
    template<typename T>
    T* get(int const address, T *t, size_t len) {
        if (address < 0 || address + len > _size)
            return t;
        memcpy((uint8_t*)t, _data + address, len);
        return t;
    }

    template<typename T> 
    const T* put(int const address, const T *t, size_t len) {
        if (address < 0 || address + len > _size)
            return t;
        if (memcmp(_data + address, (const uint8_t*)t, len) != 0) {
            _dirty = true;
            memcpy(_data + address, (const uint8_t*)t, len);
        }
        return t;
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM