Работа с памятью EEPROM

bigory
Offline
Зарегистрирован: 17.10.2018

Всем доброе время суток!

Пытаюсь в память ардуино сохранить записи, но выводится всякая хрень

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(" ");
            }
          }

Что я сделал не так?

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

bigory пишет:

Что я сделал не так?

Всё.

Попробуйте в приведённые коды вставить комментарии так, чтобы понятно было что именно Вы хотели сделать в той или иной строчке. Тогда можно будет попытаться объяснить Вам ошибки.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Странный какой код.
Какие то j+37...
А нет в EEPROM свободных ячеек памяти , в них изначально уже есть что то, обычно либо 0хFF, либо 0х00, либо мусор, зависит от того как ярко луна светила.
Вы уж определитесь что именно вы найти пытаетесь и почему ищите только в шести ячейках.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

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

Ну тогда он в 222ю запишет 0, а потом в следующие 28 какие то данные.

sadman41
Offline
Зарегистрирован: 19.10.2016

А смысл тогда искать свободный блок, если через какое-то время всё будет в одни и те же ячейки писаться?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

А смысл тогда искать свободный блок, если через какое-то время всё будет в одни и те же ячейки писаться?

Ну вдруг ему эти ячейки больше нравятся ?

bigory
Offline
Зарегистрирован: 17.10.2018

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

В переменной 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я строка

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А может просто в первых двух байтах указывать последний адрес ?
А в начале каждой записи ее длину ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Напишите ее (строку) по-английски.

bigory
Offline
Зарегистрирован: 17.10.2018

Может проблема не там, где я пытаюсь копать... если

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?

bigory
Offline
Зарегистрирован: 17.10.2018

Все, вопрос решен. 

Надо было:

str_name=str_name+String(bukvy_h[i]);

С таким кодом нормально сохраняет.

 

P.S. А вообще странно, на экране все выводится без проблем с предыдущим кодом, а вот сохраняет коряво. Подводный булыжник