2016-04-02 82 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