RFID RC522 считывает предыдущий серийный номер метки с другой меткой
Я надеюсь, что кто-нибудь сможет мне помочь.
Я использую Мега с RC522, и это происходит:
Я использую тег, он считывает правильный серийный номер (например, AA:BB:CC:DD). Затем я использую второй тег, и иногда он выдает мне правильное значение (например, 00:11:22:33), но часто он выдает мне предыдущий серийный номер тега (AA:BB:CC:DD). После нескольких попыток, он, наконец, дает мне правильный (00:11:22:33).
Я действительно не могу понять, в чем дело, и был бы благодарен, если бы кто-нибудь мог пролить свет.
Вот код:
if (RC522.PICC_IsNewCardPresent()) {
RC522.PICC_ReadCardSerial();
String strID = "";
for (byte i = 0; i < 4; i++) {
strID +=
(RC522.uid.uidByte[i] < 0x10 ? "0" : "") +
String(RC522.uid.uidByte[i], HEX) +
(i != 3 ? ":" : "");
}
String seriale = strID;
if (seriale != "0"){
for(h=0; h<=numerogiocatori -1;h++){
if (seriale == seriali[h]) {
lcd.clear();
lcd.print("Saldo Gioc. ") ;
lcd.print(h + 1) ;
Serial.print("tag ID: ");
Serial.print(seriale);
Serial.print(" . ");
lcd.setCursor(0, 1);
lcd.print(totaledenaro[h]) ;
delay(1500);
lcd.clear();
lcd.print("Importo");
lcd.setCursor(0, 1);
}
}
}}}
Спасибо всем, кто готов помочь!
@Dario Martino, 👍0
Обсуждение1 ответ
Одним из правил написания кода безопасности является :
Возвращаемое значение непустых функций должно проверяться каждой вызывающей функцией, а достоверность параметров должна проверяться внутри каждой функции.
Вы забыли проверить, был ли прочитан тег, т. е. возвращаемое значение PICC_ReadCardSerial. Если это не удается, значение не обновляется, поэтому значение по-прежнему остается старым.
Используя следующий код (из примера ReadNUID библиотеки MFRC522 https://github.com/miguelbalboa/rfid/blob/master/examples/ReadNUID/ReadNUID.ino)
// Массив инициализации, в котором будет храниться новый NUID
byte nuidPICC[4];
void loop() {
// Ищите новые карты
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Проверьте, был ли прочитан NUID
if ( ! rfid.PICC_ReadCardSerial())
Serial.println(F("NUID has NOT been readed."));
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
rfid.uid.uidByte[1] != nuidPICC[1] ||
rfid.uid.uidByte[2] != nuidPICC[2] ||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
Serial.println(F("A new card has been detected."));
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.println(F("The NUID tag is:"));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
}
else Serial.println(F("Card read previously."));
// Остановить PICC
rfid.PICC_HaltA();
// Остановить шифрование на PCD
rfid.PCD_StopCrypto1();
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
в результате получается
Обнаружена новая карта.
Тег NUID таков:
97 C6 6E 09
НУИД НЕ был прочитан.
Карточка, прочитанная ранее.
Обнаружена новая карта.
Тег NUID таков:
CC 16 5D 83
Обнаружена новая карта.
Тег NUID таков:
97 C6 6E 09
НУИД НЕ был прочитан.
Карточка, прочитанная ранее.
Обнаружена новая карта.
Тег NUID таков:
CC 16 5D 83
Иногда, когда используется второй тег, тег не считывается, и идентификатор uid остается прежним.
Спасибо, чувак. Я решил эту проблему, применив условное "ЕСЛИ" к ReadCardSerial, но ваша версия намного лучше!, @Dario Martino
"Одно правило для написания кода безопасности -" +1., @VE7JRO
- Использование RFID-RC522 с другими контактами
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- Проблема «Не найдена плата PN53x» Считыватель карт Arduino NFC
- Мой код Arduino компилируется, когда я не вижу в нем ничего плохого
- Как управлять 6 серводвигателями с помощью платы Arduino Mega?
- Программирование пользовательских Arduino Mega с Arduino Uno
Я пытался в самом начале, но ничего не получалось, спасибо, что улучшили его., @Dario Martino
Дарио, не мог бы ты поделиться своим условным решением "ЕСЛИ"?, @Anna