2016-09-12 3 views
1

Я пытаюсь прочитать конкретный блок с карты MIFARE с экраном SL018, используя Arduino Uno. Написание это не проблема, но для проекта, над которым мы и одноклассник работаем, мы должны иметь возможность читать ввод (даже для 0 или 1 будет достаточно).Невозможно прочитать байты из определенных блоков MIFARE с помощью SL018

Используя библиотеку и код, который мы нашли в Интернете, мы пришли к этому коду:

/** 
* Arduino to SL018/SL030 wiring: 
* A4/SDA  2  3 
* A5/SCL  3  4 
* 5V   4  - 
* GND  5  6 
* 3V3  -  1 
*/ 

#include <Wire.h> 
#include <SL018.h> 

byte block = 0x01; 

SL018 rfid; 

void setup() 
{ 
    Wire.begin(); 
    Serial.begin(19200); 

    // prompt for tag 
    Serial.println("Show me your tag"); 
} 

void loop() 
{ 
    rfid.seekTag(); 

    while(!rfid.available()); 

    Serial.print("Block "); 
    printHex(block); 
    Serial.print(": "); 
    printArrayHex(rfid.getBlock(), 16); 
    Serial.print(" "); 
    printArrayAscii(rfid.getBlock(), 16); 
    Serial.println(); 
} 

Кто-нибудь знает, как мы могли прочитать определенную часть кода, например, блок 1?

ответ

0

Посмотрите на это example code из библиотеки SL018. Вы можете использовать пользовательский интерфейс кода с последовательным терминалом. Если вы хотите прочитать тег, то интересную часть case 'R': (Read сектор) в строке 111.

action = READ; 
// specify what to read 
block = 0; 
numBlocks = 16; 
// tag has to be selected first 
rfid.selectTag(); 

После определения вашего блока, вы можно прочитать.

0

Учитывая, что вы ссылаетесь на блоки, и что вы, кажется, предполагают, что блок состоит из 16 байтов в ваших вызовов printArrayHex(), я предполагаю, что вы пытаетесь прочитать MIFARE Классические карты.

Вы бы сначала дождаться тега:

rfid.seekTag(); 
while (!rfid.available()); 

Вы можете проверить подлинность сектора, который вы хотите прочитать. Например, чтобы прочитать блок номер 5 (который находится в секторе 1), вы должны пройти аутентификацию в секторе 1. Предполагая, что этот сектор имеет свой ключ A, установленный по умолчанию (FF FF FF FF FF FF) и настроенный для доступа к чтению к блоку 5, вы можете Применение:

byte TRANSPORT_KEY[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 

// authenticate current sector using key type A and the key TRANSPORT_KEY 
rfid.authenticate(1, 0xAA, TRANSPORT_KEY); 

Наконец, вы можете прочитать данные из блока 5:

rfid.readBlock(5); 
Serial.print("Block 5: "); 
printArrayHex(rfid.getBlock(), 16); 
Serial.println(); 

в качестве альтернативы, если вы хотите, чтобы прочитать всю память карты Mifare Classic 1K (и предполагая, что все блоки читаемый с использованием ключа A с значением TRANSPORT_KEY), вы можете использовать примерно следующее:

for (byte sector = 0; sector < 16; ++sector) { 
    // authenticate current sector using key type A and the key TRANSPORT_KEY 
    rfid.authenticate(sector, 0xAA, TRANSPORT_KEY); 
    for (byte block = 0; block < 4; ++block) { 
     rfid.readBlock(sector * 4 + block); 

     Serial.print("Sector "); 
     Serial.print(sector); 
     Serial.print(", Block "); 
     Serial.print(block); 
     Serial.print(": "); 
     printArrayHex(rfid.getBlock(), 16); 
     Serial.println(); 
    } 
} 
Смежные вопросы