Arduino RC-522 RFID阅读器 - 比较字节数组中的值

时间:2016-04-02 23:55:00

标签: arduino

我正在使用以下代码成功地将ID从MIFARE卡读取到串行监视器。

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

int readflag;
byte readCard[4];           

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.

///////////////////////////////////////// Setup ///////////////////////////////////
void setup() {

  Serial.begin(9600); 
  SPI.begin();         
  mfrc522.PCD_Init();   
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); 

lcd.begin(20, 4);

    }

///////////////////////////////////////////////////////////////////////////////
  // Main loop
///////////////////////////////////////////////////////////////////////////////
void loop () {

 do {                                                               
   readflag = checkread(); 
  }
    while (!readflag); 

//If card detected do this

       recordid();
  }

///////////////////////////////////////////////////////////////////////////////
  // Stores the ID of the card that's been detected in readCard byte array
///////////////////////////////////////////////////////////////////////////////
void recordid() {
    mfrc522.PICC_IsNewCardPresent();
    mfrc522.PICC_ReadCardSerial();
   lcd.clear();
    for (int i = 0; i < 4; i++) { 
        readCard[i] = mfrc522.uid.uidByte[i];  
             Serial.print( mfrc522.uid.uidByte[i], HEX);  

        }
    Serial.println("");
    mfrc522.PICC_HaltA();
  }


/////////////////////////////////////////////
  // Returns 1 if a card has been detected
/////////////////////////////////////////////
int checkread() {
   if ( ! mfrc522.PICC_IsNewCardPresent()) { 
    return 0; }                                        //no card detected

    mfrc522.PICC_HaltA(); 
    return 1; }                                       //card detected

我有12张卡,而串口显示器告诉我他们的ID是(十六进制):

3278CE3F F5C9FD29 2FC640 82BA7A3F 2BD7A3F 52B77A3F B2E5640 F2DD640 E2ECCC3F 22B3640 2FD640 73D5B7AC

我知道这些存储在readCard字节数组中。

我想将此字节数组的当前值与已知值进行比较,以确定是否运行指令(例如LED的闪烁)

这样的事情:

if(readCard = 2FD640){     打开LED }

我已经能够成功地使用这个if语句:

if((uint32_t )readCard == 0x3FCE7832)

例如卡片一。但是,它不适用于ID不是8位数的卡,即卡11(2FD640)。

任何人都可以帮我在代码中实现这个吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

我不知道为什么if ( (uint32_t)readCard == 0x3FCE7832)为你工作;它不应该,因为你正在向一个32位整数转换byte指针。你应该做的是:

  • readCard声明为uint8_t指针,而不是byte
  • 比较应如下:if (*((uint32_t *)readCard) == 0x3FCE7832)

但是就像你说的那样,这对第11张牌不起作用。你必须用零填充反转的文字,如:if (*((uint32_t *)readCard) == 0x40D62F00)。要获得反转的文字(例如0x2FDD640),写出用零填充的左边的完整字节,使其成为8位数(例如0x02FDD640)。然后反转字节的顺序(例如0x40D6FD02)。

您还可以将卡UID作为数组存储在代码中,并逐字节进行比较,以便不依赖于UID的大小来创建32位整数。

答案 1 :(得分:0)

您可以像这样使用union

union
{
  byte Bytes[4];
  uint32_t Integer;
} UnionCard;

像这样使用:

UnionCard Uc;

在循环中填写类似于readCard[i]的内容,如下所示:

Uc.Bytes[i] = mfrc522.uid.uidByte[i];

获取UInt:

Uc.Integer;