了解如何从 RFID Arduino 读取 UID

Understanding how to read UID from RFID Arduino

请问有没有大佬帮我把网上找的这段代码每行都评论一下,看看流程?我似乎很困惑,尤其是对使用的三元运算符。我想将它用于我的项目,但我不想使用我无法正确理解的代码。此代码打印出扫描到串行监视器中的 RFID 标签的 UID,但我不确定每个功能。

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

这里发生的绝大部分发生在 MFRC522 class 内部,我们看不到它,因为它包含在某些头文件中。要对此进行解释,您可能应该去任何地方的文档 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