string в eeprom

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

не пойму немного, 

EEPROM.put(400, password);
        EEPROM.get(400, password_12);
Serial.println(password_12);
// сразу после записи - код значение зачитывается правильно
// а после перезагрузки
EEPROM.get(400, password_12);
Serial.println(password_12);
// пишет уже какую то туфту

стринги не могут залезть в епром? или в чем причина.... 

5N62V
Offline
Зарегистрирован: 25.02.2016

d13lider пишет:

стринги не могут залезть в епром? или в чем причина.... 

может при перезагрузке теряется размер стрингов?

считайте по-байтово, чтоб проверить

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

блин, в общем в пустой программе все работает нормально

#include <EEPROM.h>
String password = "";
String password_12 = "";

void setup() {
  Serial.begin(9600);
  password = "pissword";
  EEPROM.put(600, password);
  EEPROM.get(600, password_12);
  Serial.println(password_12);
}

void loop() {
  Serial.println(password_12);
}

а если в свой код вставляю получаю на выходе квадраты

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

даже беру записываю этим скетчем а в своей программе пытаюсь считать и квадраты

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

хотя считываю этим скетчем (закоментировав  EEPROM.put(600, password);) все хорошо считывается

b707
Offline
Зарегистрирован: 26.05.2017

ну значит пора вылезти из коротких штанишек и научится все же пользоваться char* для строк :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Конечно, не может. Как он туда залезет, если у него буффер динамически получен?

Запихать можно, но не так просто.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ЕвгенийП пишет:

Конечно, не может. 

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, если Вам проще жить со String, так проще запихать его туда. Только это не в лоб делается.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ЕвгенийП пишет:

Да, если Вам проще жить со String, так проще запихать его туда. Только это не в лоб делается.

ну я в общем сделал так, добавил в строку символ \0 увидел сколько символов в строке .length(), потом записал в массив char по символу .toCharArray и потом массив записал в eeprom, вот такое решение пришло на ум

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

d13lider пишет:

ЕвгенийП пишет:

Да, если Вам проще жить со String, так проще запихать его туда. Только это не в лоб делается.

ну я в общем сделал так, добавил в строку символ \0 увидел сколько символов в строке .length(), потом записал в массив char по символу .toCharArray и потом массив записал в eeprom, вот такое решение пришло на ум

Символ \0 и так уже есть в строке. Лишние преобразования, типа toCharArray - не нужны, от слова "совсем":

for(int i=0;i<str.length();i++)
	EEPROM.write(address++,str[i]);

EEPROM.write(address++,0);

Три строчки. Записывается и 0. Вычитывается - аналогично, до первого 0.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем ++ в строке 4? Типа если для следующей строки использовать?

А вычитывается ещё проще. У String есть и конструктор "из флеша", и оператор присвания, т.е. всё уже украдено до нас.