了解如何从 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
请问有没有大佬帮我把网上找的这段代码每行都评论一下,看看流程?我似乎很困惑,尤其是对使用的三元运算符。我想将它用于我的项目,但我不想使用我无法正确理解的代码。此代码打印出扫描到串行监视器中的 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