Понимание того, как читать UID из RFID Arduino

avatar
Angelo Juanico
9 августа 2021 в 05:07
356
1
0

Мне интересно, может ли кто-нибудь помочь прокомментировать каждую строку и выполнить процесс этого кода, который я нашел в Интернете? Я кажусь довольно запутанным, особенно с использованием тернарного оператора. Я хотел бы использовать его для своего проекта, но мне не нравится использовать код, который я не совсем понимаю. Этот код распечатывает UID метки RFID, отсканированной в последовательный монитор, но я не уверен в каждой функции.

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key; 

// Init array that will store new NUID 
byte nuidPICC[4];

void setup() { 
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}
 
void loop() {

  // Look for new cards
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;

 for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
   
  printHex(rfid.uid.uidByte, rfid.uid.size);
   Serial.println();
   rfid.PICC_HaltA();

  
  rfid.PCD_StopCrypto1();
}
void printHex(byte *buffer, byte bufferSize) { //Loops as big as UID size
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " "); //Ternary returns 0 if < 0x10
    Serial.print(buffer[i], HEX);
  }
}
Источник
hcheung
10 августа 2021 в 14:13
0

Существует хорошо написанный документ в библиотеке MFRC522 github. Также попробовал примеры, доступные в библиотеке, которая хорошо прокомментирована.

Ответы (1)

avatar
Daniel McLaury
10 августа 2021 в 05:36
0

Подавляющее большинство того, что здесь происходит, происходит внутри класса MFRC522, который мы не можем видеть, поскольку он включен из какого-то заголовочного файла. Для объяснения этого вам, вероятно, следует обратиться к документации, где бы вы ни находились MFRC522.h

.

Однако вы специально спрашивали о троичном коде, который можно увидеть здесь:

void printHex(byte *buffer, byte bufferSize) { //Loops as big as UID size
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " "); //Ternary returns 0 if < 0x10
    Serial.print(buffer[i], HEX);
  }
}

Здесь мы перебираем массив байтов и выводим их в шестнадцатеричном виде.

Предположительно Serial.print(n, HEX) печатает число в шестнадцатеричном формате. Проблема с этим, по-видимому, в том, что мы хотим, чтобы наш вывод выглядел, скажем,

FF 03 FF FF 00

тогда как, если бы мы просто распечатали каждый байт в шестнадцатеричном виде, мы бы получили

FF 3 FF FF 0

Таким образом, приведенный здесь код решает эту проблему, проверяя, будет ли число состоять только из одной цифры (т. е. меньше 0x10), и, если это так, печатает ноль перед выводом числа:

    Serial.print(buffer[i] < 0x10 ? " 0" : " "); //Ternary returns 0 if < 0x10