Записать строку в постоянную флеш-память Arduino ESP32 - PullRequest
0 голосов
/ 15 мая 2019

Я хочу записать текст во флэш-память Arduino ESP32.Это работает вроде как, но не так, как я хочу.

void writeString(const char* toStore, int startAddr) {
  int i = 0;
  for (; i < LENGTH(toStore); i++) {
    EEPROM.write(startAddr + i, toStore[i]);
  }
  EEPROM.write(startAddr + i, '\0');
  EEPROM.commit();
}

Мой звонок

writeString("TEST_STRING_TO_WRITE", 0);

только записывает TEST в память.Я не понимаю почему.Это из-за _?Или я пропускаю что-то другое?

Вот макрос LENGTH

#define LENGTH(x) (sizeof(x)/sizeof(x[0]))

и метод, который я использую, чтобы снова прочитать строку из памяти (которая, кажется, работает правильно):

String readStringFromFlash(int startAddr) {
  char in[128];
  char curIn;
  int i = 0;
  curIn = EEPROM.read(startAddr);
  for (; i < 128; i++) {
    curIn = EEPROM.read(startAddr + i);
    in[i] = curIn;
  }
  return String(in);
}

1 Ответ

1 голос
/ 15 мая 2019

Откуда ты взял этот макрос LENGTH? Это сюрреалистично.

sizeof не будет делать то, что вы хотите здесь. Это функция времени компиляции, которая вычисляет требования к хранилищу своего аргумента. В этом случае он должен возвращать длину в байтах указателя символа, а не строку, на которую он указывает.

Вы хотите использовать strlen (), предполагая, что ваш символ * является правильно завершенной C-строкой. Добавьте еще один, чтобы убедиться, что в конце также хранится символ «\ 0».

#define LENGTH(x) (strlen(x) + 1)
...