Запись и чтение FM24Cxx

«не читал, но осуждаю»

Мне всегда только такие карточки попадались

но, говорят, есть еще карты, где 7 байт ID. Не встречал

Но, у него и не 4 и не 7, а хрень какая-то

Если постараться, “головняк” себе завсегда найти можно))

И думаю дело не памяти. В посте # 10, я тупо пытался по байтно (символьно) переписать строку… результат тот же.

Для начала надо выяснить всё-же что и как он читает и какой у него стандарт карты. Самые распространенные у китаёз - Classic

Как по мне, ТС в стрингах запутался, нет чтоб просто 10 байт сравнить, но я уже на сегодня всё, завершился))

Простите, может я не в теме, но мне казалось что String сравнивают только через compareTo() | Аппаратная платформа Arduino

Не, у ей оператор == переопределен. Но внутри канеш он вызывает compareTo()

Вообще-то другого способа сравнения строк не существует.

2 лайка

Вот так всё норм. получается

Спойлер
String A = "aburvalg01";
String B = "aburvalg02";


void setup() {
  Serial.begin(9600);

  B.setCharAt(0, A.charAt(0));
  B.setCharAt(1, A.charAt(1));
  B.setCharAt(2, A.charAt(2));
  B.setCharAt(3, A.charAt(3));
  B.setCharAt(4, A.charAt(4));
  B.setCharAt(5, A.charAt(5));
  B.setCharAt(6, A.charAt(6));
  B.setCharAt(7, A.charAt(7));
  B.setCharAt(8, A.charAt(8));
  B.setCharAt(9, A.charAt(9));
  if(A == B)
  Serial.println("OK");
  else
  Serial.println("ERR");
}

void loop() {

}

Спойлер

Screenshot_297 - копия

Однако, что интересно, если делать так

String A = "aburvalg01";
String B ;

то не прокатывает.

Решил и так проверить - всё тоже работает!

Спойлер
String A = "aburvalg01";
String B = "aburvalg02";


void setup() {
  Serial.begin(9600);
  B[0] = A[0];
  B[1] = A[1];
  B[2] = A[2];
  B[3] = A[3];
  B[4] = A[4];
  B[5] = A[5];
  B[6] = A[6];
  B[7] = A[7];
  B[8] = A[8];
  B[9] = A[9];
 
  if (A == B)
    Serial.println("OK");
  else
    Serial.println("ERR");
}

void loop() {

}
Спойлер

Screenshot_297 - копия

Я бы всё проверял отдельно.
RFID - просто присваиваем значение.
Запись в FM24C02С заменить на запись в встроенную EEPROM, или просто писать в массив.
Упростить всё, и, станет ясно, где косяк.

Если об’явить так:
String A = “aburvalg01”;
String B;
то - ERR

Я об этом и говорю

Но непонятно, почему в #9

-а у меня в #31 всё норм
Что , Стринг поломался?

А кто будет заниматься выделением памяти в B под буфер? Присвоением в пустой B из A посимвольно просто портит память где-то. Побайтно сравнение этого мусора с оригиналом работает. А структура класса String таким вандализмом нарушена, сравнение все таки пустой B c оригиналом не проходит. Радуйтесь, что проект у вас маленький и запорченая память не рушит работу остальных алгоритмов.

Короче, курите правила работы со строками, изучайте строение класса String.

По специфике задачи - строки тут нафиг не взялись. Вообще без них нужно. Идентификаторы - это числа.

UB (undefined behavior). Следствие порчи памяти. Все правильно, прям по учебнику.

Программист сломался.

del
вопрос снимается, я прочитал внимательно о чем речь.

Оно то да, ещё Дед говорил об этом.
Но, строки бояться - в лес не ходить.)) Я за то, чтобы всё равно
разобраться, где косяк. Может вообще, где-то в другом месте.
А там ТС -хозяин -барин конечно, его дело

При сложении двух строк, память автоматом выделяется,
а здесь почему-то “автомат” не работает.Так видимо задумано.
Но это я просто как пример привёл. Как один из вариантов, “почему?”. ТС тут не при чём.

void readKeyEEPROM(String EEROM)
{ 
char addr[11]; //!!!!!! - 11
...
if (Wire.available())
  { for (int i = 0; i < length ; i++)
    { addr[i] = Wire.read();
      delay(1);
    }
  }
  if (EEROM == "K00")
  { idkey00 = String(addr);
    Serial.print(str + " - " + idkey00 + " - ");
  }
...
addr[length] = 0x00; // !!!!!! NULL-terminated
}

Это на глазок. Выпороть бы за такой код, но расширение и зануление буфера как минимум главное исправление ошибки.
Сейчас в получившейся idKeyXX оказывается прочитанное значение плюс весь мусор из стека до первого встретившегося ноля. Ставя размер буфера в 11 символов и записывая ноль в последнюю позицию мы явно задаем конец строки при инициализации.

Я и объяснил на примере (что приводился). Если просто

String B;
B[0] = 'a';
B[1] = 'b';

то символы ‘a’ и ‘b’ будут записаны в неопределенное место в памяти. Для неинициализированного стринга (нет исходников перед глазами) в нулевой указатель (адреса 0 и 1 в оперативке).
Сравнение посимвольно даст совпадение. Сравнение функциями строк - нет. Ибо сразу же B как пустая строка определяется.

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

Фишка в том, что ардуинка не вываливается в эксепшн при обращении к нулевому указателю. Поэтому малые тестовые проекты дымятся, но держатся. Хоть и глючат. Большой компьютер сразу валится, на нем люди быстрее умнеют. 8)

Да, подобные ошибки есть в коде. Я тоже одну указал.
Надо весь код тщательно проверить, может полегчает))

Сложение - это операция над строками, но строка - не есть массив символов, поэтому пытаться работать с ней как с массивом приводит к ошибке.