Почему EEPROM.get() не работает?
Я пытаюсь сохранить строку / символ в EEPROM с помощью EEPROM.put()
, а затем получить значение, но это не работает, и я получаю пустое значение, когда я выполняю EEPROM.get()
.
Я помню, что именно так это работало на arduino nano, но теперь я пытаюсь использовать плату ESP32, они работают по-другому?
#include <EEPROM.h>
char my_string[8];
void setup() {
Serial.begin(115200);
// Я пишу по этому коду, затем комментирую его, чтобы попытаться прочитать из EEPROM
/*
my_string[0] = 'S';
my_string[1] = 'N';
my_string[2] = '-';
my_string[3] = 'A';
my_string[4] = 'B';
my_string[5] = 'C';
my_string[6] = 'D';
EEPROM.put(0, my_string);
*/
EEPROM.get(0, my_string);
Serial.println("data is: ");
Serial.println((char*)my_string);
}
void loop() { }
@adrianTNT, 👍1
1 ответ
Лучший ответ:
▲ 4
EEPROM не может хранить строку. Он хранит числа. put()
принимает тип и сохраняет этот тип в виде чисел.
Символ[]
- это не строка, а число. Более конкретно, это адрес памяти, в которой хранятся строковые данные.
Все, что вы делаете, это сохраняете этот адрес памяти, а не сами данные.
Вместо этого вам нужно выполнить итерацию по вашей строке. Вы также должны сохранить длину строки, если она будет переменной.
Например:
void storeString(const char *str) {
EEPROM.write(0, strlen(str)); // Сохранить длину строки
for (int i = 0; i < strlen(str); i++) {
EEPROM.write(i + 1, str[i]);
}
}
void getString(char *str) {
int len = EEPROM.read(0);
for (int i = 0; i < len; i++) {
str[i] = EEPROM.read(i + 1);
}
}
,
@Majenko
Смотрите также:
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Выделение строковой памяти Arduino
- Spiffs против Eeprom на esp8266
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
- Разбор строк приема Arduino
- Чтение из SPIFFS - Как лучше всего работать со строковым (или char) массивом с неопределенной длиной?
- Энергонезависимое хранение nRF52/возврат переменной-есть ли простое решение?
- Чтение и запись в EEPROM