2016-04-02 3 views
0

Ich verwende den folgenden Code, um IDs von MIFARE-Karten erfolgreich auf dem seriellen Monitor zu lesen.Arduino RC-522 RFID-Lesegerät - Vergleichen von Werten in einem Byte-Array

#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 

Ich habe 12 Karten und die serielle Monitor sagt mir, dass ihre IDs sind (hex):

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

Ich verstehe und diese werden im readCard-Byte-Array gespeichert.

Ich möchte den aktuellen Wert dieses Byte-Array auf einen bekannten Wert zu vergleichen, um zu bestimmen, ob eine Anweisung (zB ein Blinzeln eines LED) ausgeführt wird

Etwas wie folgt aus:

If (readCard = 2FD640) { wiederum auf LED }

ich in der Lage gewesen, dies erfolgreich zu tun dies mit if-Anweisung:

if ((uint32_t) readCard == 0x3FCE7832)

zum Beispiel Karte eins. Es wird jedoch nicht mit den Karten mit IDs funktionieren, die nicht 8 Ziffern lang sind, d. H. Karte 11 (2FD640).

Kann mir jemand helfen, dies im Code zu implementieren?

Vielen Dank.

+0

Arduino ist nicht C! – Olaf

Antwort

0

Ich weiß nicht, warum if ((uint32_t)readCard == 0x3FCE7832) für Sie arbeitete; Es sollte nicht, da Sie einen byte Zeiger auf eine 32-Bit-Ganzzahl werfen. Was haben Sie sollte getan ist:

  • Deklarieren readCard als uint8_t Zeiger und nicht byte
  • Der Vergleich sollte wie folgt sein: if (*((uint32_t *)readCard) == 0x3FCE7832)

Aber wie Sie gesagt haben, dies wird nicht funktionieren für den 11. Karte. Sie müssen das umgekehrte Literal mit Nullen auffüllen, so: if (*((uint32_t *)readCard) == 0x40D62F00). Um das umgekehrte Literal (z. B. 0x2FDD640) zu erhalten, schreibe das vollständige, links mit Nullen aufgefüllte Byte aus, um 8 Ziffern zu bilden (z. B. 0x02FDD640). Dann kehren Sie die Reihenfolge der Bytes um (z. B. 0x40D6FD02).

Sie könnten die Karten-UIDs auch als Arrays in Ihrem Code speichern und sie Byte für Byte vergleichen, sodass keine Abhängigkeit von der Größe der UID zum Erstellen von 32-Bit-Ints besteht.

+0

Danke, ich habe dies implementiert, aber es funktioniert nicht mit den Karten, die nicht 4 Bytes sind. d. h., die Karte F2DD640 wird nicht gefunden, wenn ich nach * ((uint32_t *) readCard) suche == 0x64DDF200 – mh512

+0

@ mh512 das ist, weil Sie nicht richtig auffüllen. Ich werde meine Antwort bearbeiten – TisteAndii

+1

@ mh512 funktioniert es jetzt? – TisteAndii

0

Sie könnten eine union wie folgt verwenden:

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

Verwenden Sie es wie folgt aus:

UnionCard Uc; 

es Füllen ähnlich wie Ihre readCard[i] in der Schleife wie folgt aus:

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

Holen Sie sich das UInt mit:

Uc.Integer; 
+0

Danke - aber ich bekomme "unqualifizierte ID vor '[' Token Union" erwartet, wenn die Union wie oben erklärt. Gewerk UnionCard { byte [4] Bytes; uint32_t Ganze Zahl; }; – mh512

+1

@ mh512 Oh ja Entschuldigung, es gab einen kleinen Fehler. Ich habe den Code korrigiert! – Fruchtzwerg

Verwandte Themen