Работа с памятью 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()
Логика такова:
1)Ищу в каждом блоке данных 1ю булевую запись, из которой я делаю вывод что место памяти занято или свободно
2)Проверяю не получится так, что часть данных попадут за адресное пространство
3)Записываю блок данных
4)Просто проверяю правильно ли все записалось
В итоге получается такая хрень на выводе монитора:
Не нравится 2я строка
А может просто в первых двух байтах указывать последний адрес ?
А в начале каждой записи ее длину ?
Напишите ее (строку) по-английски.
Может проблема не там, где я пытаюсь копать... если
То все супер...
Может проблема здесь?
У меня есть массив русских букв.
Алфавит, что видно на картинке выводится из bukvy_h[]
Слово "Русские буквы" это str_name. Может проблема const char + String?
Все, вопрос решен.
Надо было:
С таким кодом нормально сохраняет.
P.S. А вообще странно, на экране все выводится без проблем с предыдущим кодом, а вот сохраняет коряво. Подводный булыжник