Работа с памятью EEPROM
- Войдите на сайт для отправки комментариев
Ср, 17/10/2018 - 00:42
Всем доброе время суток!
Пытаюсь в память ардуино сохранить записи, но выводится всякая хрень
String str_name="Текстовое поле";
byte ReadID[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
...
int j;
bool buf;
char charBuf[28];
str_name.toCharArray(charBuf, str_name.length());
//Ищем свободные участки памяти
for (j=0; j+37<255; j=j+37)
{
EEPROM.get(j, buf);
if(buf!=false)
{
Serial.print("Записываем с:");
Serial.println(j);
break;
}
}
//Записываем
EEPROM.put(j,false);
j=j+1;
for(int q=0;q<28;q++)
{
EEPROM.put(j,charBuf[q]);
j=j+1;
}
for (byte x = 0; x < 8; x++)
{
EEPROM.put(j,ReadID[x]);
j=j+1;
}
Пытаюсь считать:
//Выводим результат на монитор для проверки
char charBuf_1[28];
Serial.println("Сохраненные в памяти:");
int a=0;
byte ID;
for (j=0; j+37<255; j=j+37)
{
EEPROM.get(j, buf);
if(buf==false)
{
for(int q=0;q<28;q++)
{
EEPROM.get(j+q+1,charBuf_1[q]);
Serial.print(charBuf_1[q]);
a=j+q+2;
}
Serial.print(": ");
for (byte x = 0; x < 8; x++)
{
EEPROM.get(a+x,ID);
Serial.print(ID, HEX);
}
Serial.println(" ");
}
}
Что я сделал не так?
Что я сделал не так?
Всё.
Попробуйте в приведённые коды вставить комментарии так, чтобы понятно было что именно Вы хотели сделать в той или иной строчке. Тогда можно будет попытаться объяснить Вам ошибки.
Странный какой код.
Какие то j+37...
А нет в EEPROM свободных ячеек памяти , в них изначально уже есть что то, обычно либо 0хFF, либо 0х00, либо мусор, зависит от того как ярко луна светила.
Вы уж определитесь что именно вы найти пытаетесь и почему ищите только в шести ячейках.
А мне всегда интересует не что в процессе, а что в финале происходить будет... Вот закончился цикл, свободных блоков по 37 байт не найдено... и?..
А мне всегда интересует не что в процессе, а что в финале происходить будет... Вот закончился цикл, свободных блоков по 37 байт не найдено... и?..
Ну тогда он в 222ю запишет 0, а потом в следующие 28 какие то данные.
А смысл тогда искать свободный блок, если через какое-то время всё будет в одни и те же ячейки писаться?
А смысл тогда искать свободный блок, если через какое-то время всё будет в одни и те же ячейки писаться?
Ну вдруг ему эти ячейки больше нравятся ?
Переписал код на более менее понятный. Попробую разложить всю идею по полочкам.
В переменной str_name (тип String) хранится имя, которое всегда <=14 символов
В переменная ReadID (тип byte) состоит из массива, в ней хранится код ключа
Метка о том, что в ячейке памяти присутствует запись, это булевая переменная (в коде это false и true)
Структура записи, которую я пытаюсь сохранить в память такова:
1 байт false/true
28 байт str_name, у которой может быть максимум 14 символов (каждый символ по 2 байта [может быть здесь я ошибаюсь...])
8 байт ReadID, которая состоит из 8 значений (каждое значение по 1 байту)
Итого: 37 байт. Учитывая, что память начинается с 0 адреса, то последний байт будет на 36 адресе, соответственно следующий блок записи будет начинаться с 37 адреса.
void eeprom_rw()
{ //Ищем свободную чейка памяти j=0; do { j=j+1+28+8; } while (EEPROM.read(j)==false); //Отклоняем записи, которые не помещаются в памяти if(EEPROM.length()<j+1+28+8){} else { //Записываем блок данных EEPROM.write(j,false); j=j+1; EEPROM.put(j,str_name); j=j+27; for (byte x = 0; x < 8; x++) { EEPROM.put(j,ReadID[x]); j=j+1; } //Вывожу адрес, на котором я остановился Serial.println(j);*/ //Выводим результат на монитор для проверки bool a=true; String str_1; byte ReadID1[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; j=0; Serial.println("Сохраненные в памяти:"); a=EEPROM.read(j); j=j+1; EEPROM.get(j,str_1); j=j+27; for (byte x = 0; x < 8; x++) { EEPROM.get(j,ReadID1[x]); j=j+1; } Serial.println(str_1); for (byte x = 0; x < 8; x++) { Serial.print(ReadID1[x], HEX); } } }Логика такова:
1)Ищу в каждом блоке данных 1ю булевую запись, из которой я делаю вывод что место памяти занято или свободно
2)Проверяю не получится так, что часть данных попадут за адресное пространство
3)Записываю блок данных
4)Просто проверяю правильно ли все записалось
В итоге получается такая хрень на выводе монитора:
Сохраненные в памяти: ⸮;⸮[⸮⸮wL⸮⸮e⸮?6⸮&⸮Q⸮5s*-⸮{ 15012ED70042Не нравится 2я строка
А может просто в первых двух байтах указывать последний адрес ?
А в начале каждой записи ее длину ?
Напишите ее (строку) по-английски.
Может проблема не там, где я пытаюсь копать... если
else { //Записываем блок данных EEPROM.write(j,false); j=j+1; EEPROM.put(j,"Русский язык"); j=j+27; for (byte x = 0; x < 8; x++) { EEPROM.put(j,ReadID[x]); j=j+1; }То все супер...
Может проблема здесь?
const char* bukvy_h[]={"А","Б","В","Г","Д","Е","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ы","Э","Ю","Я"," "}; String str_name; ..... str_name=str_name+bukvy_h[i];У меня есть массив русских букв.
Алфавит, что видно на картинке выводится из bukvy_h[]
Слово "Русские буквы" это str_name. Может проблема const char + String?
Все, вопрос решен.
Надо было:
С таким кодом нормально сохраняет.
P.S. А вообще странно, на экране все выводится без проблем с предыдущим кодом, а вот сохраняет коряво. Подводный булыжник