запись и чтение объекта во флэш-память esp32, arduino - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь сохранить некоторые данные, инкапсулированные в объект, во флэш-памяти ESP32.

Кажется, что запись объекта в память с помощью putBytes работает хорошо, но я не представляю, как его прочитать.

Способ, которым я пытался это сделать, не работает...

#include <Preferences.h>
Preferences eeprom;

typedef struct {
  long  var1 = -1;
  long  var2 = -1;
  long  var3 = 0;
  byte  var4 = 0;
} someObject;

someObject object_[4][24];
someObject object_1_[4][24];

void setup() {
  Serial.begin(115200);
  eeprom.begin("Settings", false);

  object_[0][0].var1  = 25889;
  object_[0][0].var2   = 25890;
  object_[0][0].var3 = 25891;

  object_[1][2].var1  = 25892;
  object_[1][2].var2   = 25893;
  object_[1][2].var3 = 25894;

  eeprom.putBytes("someObject", &object_[4][24], sizeof(object_[4][24]));

  Serial.print("sizeof(object_[4][24]) = "); Serial.println(String(sizeof(object_[4][24])));

  size_t schLen = eeprom.getBytes("someObject", NULL, NULL);

  Serial.print("sizeof(someObject) = "); Serial.println(String(schLen));

  char buffer[schLen];

  eeprom.getBytes("someObject", &object_1_[4][24], schLen); // I know use of "&" is wrong, but havn't idea to fix it

  Serial.println("--------**********************************");
  Serial.println(String(object_[0][0].var1));
  Serial.println(String(object_[0][0].var2));
  Serial.println(String(object_[0][0].var3));

  Serial.println("--------");
  Serial.println(String(object_1_[1][2].var1));
  Serial.println(String(object_1_[1][2].var2));
  Serial.println(String(object_1_[1][2].var3));

  Serial.println("===========================================");

  Serial.println(buffer);
}

void loop() {}

Заранее спасибо за любую идею!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

спасибо за помощь! рабочий код:

#include <Preferences.h>
Preferences eeprom;

typedef struct {
  long  var1 = -1;
  long  var2 = -1;
  long  var3 = 0;
  byte  var4 = 0;
} someObject;

someObject object_[4][24];
someObject object_1_[4][24];

void setup() {
  Serial.begin(115200);
  eeprom.begin("Settings", false);

  object_[0][0].var1  = 25889;
  object_[0][0].var2   = 25890;
  object_[0][0].var3 = 25891;

  object_[1][2].var1  = 25892;
  object_[1][2].var2   = 25893;
  object_[1][2].var3 = 25894;

  eeprom.putBytes("someObject", &object_, sizeof(object_));

  Serial.print("sizeof(object_) = "); Serial.println(String(sizeof(object_)));

  size_t schLen = eeprom.getBytes("someObject", NULL, NULL);

  char buffer[schLen]; // prepare a buffer for the data

  eeprom.getBytes("someObject", buffer, schLen);
  memcpy(object_1_, buffer, schLen);

  Serial.print("sizeof(someObject) = "); Serial.println(String(schLen));

  Serial.println("--------**********************************");
  Serial.println(String(object_[0][0].var1));
  Serial.println(String(object_[0][0].var2));
  Serial.println(String(object_[0][0].var3));

  Serial.println("--------");
  Serial.println(String(object_1_[1][2].var1));
  Serial.println(String(object_1_[1][2].var2));
  Serial.println(String(object_1_[1][2].var3));

  Serial.println("===========================================");

  Serial.println(buffer);
}

void loop() {}
0 голосов
/ 06 ноября 2019

Как и в примере использования Preferences (https://github.com/espressif/arduino-esp32/blob/master/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino),, вам нужно прочитать байты в буфер перед преобразованием в структуру.

В вашем случае вы объявляете буфер, но никогда не используетеэто. Поскольку вы знаете точный размер массива, вы сможете напрямую скопировать его из buffer в object_.

char buffer[schLen]; // prepare a buffer for the data
eeprom.getBytes("someObject", buffer, schLen);
memcpy(object_, buffer, schLen);
...