2016-04-02 47 views
0

我正在使用以下代码将ID从MIFARE卡成功读取到串行监视器。Arduino RC-522 RFID阅读器 - 比较字节数组中的值

#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的闪烁)

像这样:

如果(readCard = 2FD640){ 打开LED }

我已经能够成功地做到这一点,如果语句中使用这样的:

如果((uint32_t的)readCard == 0x3FCE7832)

例如卡片1。但是,它不适用于身份证不是8位数字的卡,即卡11(2FD640)。

任何人都可以帮助我在代码中实现此?

非常感谢。

+0

Arduino不是C! – Olaf

回答

0

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

  • 声明readCarduint8_t指针,而不是byte
  • 的比较应该是这样的:if (*((uint32_t *)readCard) == 0x3FCE7832)

但是就像你说的,也是第十一届这不会工作卡。您必须用零填充反转字面值,如下所示:if (*((uint32_t *)readCard) == 0x40D62F00)。要获得反转字面值(例如0x2FDD640),请写出填充了0的完整字节,使其成为8位数字(例如0x02FDD640)。然后颠倒字节的顺序(例如0x40D6FD02)。

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

+0

谢谢,我已经实现了这一点,但它不适用于不是4字节的卡片。即当我寻找*((uint32_t *)readCard)时找不到F2DD640卡。== 0x64DDF200 – mh512

+0

@ mh512这是因为你没有正确填充。我会编辑我的回答 – TisteAndii

+1

@ mh512现在可以工作吗? – TisteAndii

0

你可以使用一个union这样的:

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

使用方法如下:

UnionCard Uc; 

它类似于填写您readCard[i]的循环是这样的:

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

获取UInt:

Uc.Integer; 
+0

谢谢 - 但是我在'声明联合'的时候得到'['token union'之前的'unqualified-id'。 联合UnionCard 字节[4]字节; uint32_t整数; }; – mh512

+1

@ mh512噢对了,有一个小错误。我纠正了代码! – Fruchtzwerg