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

Спасибо всем, кто готов помочь!

, 👍0

Обсуждение

Я пытался в самом начале, но ничего не получалось, спасибо, что улучшили его., @Dario Martino

Дарио, не мог бы ты поделиться своим условным решением "ЕСЛИ"?, @Anna


1 ответ


2

Одним из правил написания кода безопасности является :

Возвращаемое значение непустых функций должно проверяться каждой вызывающей функцией, а достоверность параметров должна проверяться внутри каждой функции.

Вы забыли проверить, был ли прочитан тег, т. е. возвращаемое значение 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