2016-09-12 39 views
1

我正尝试使用Arduino Uno从带有SL018屏蔽的MIFARE卡中读取特定块。写它是没有问题的,但对于一个项目我和一个同学正在努力,我们需要能够读取输入(即使是0或1就足够了)。无法使用SL018从MIFARE的特定块读取字节

使用图书馆,我们在网上找到了一个代码,我们来到这个代码:

/** 
* 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

看看这个SL018库房的example code。您可以使用带有串行终端的代码的用户界面。如果你想读取标签时,intresting部分在线路111

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

在定义块后case 'R':(读取的扇区),你可以阅读。

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经典1K卡的整个内存(并假设所有块可以使用带有TRANSPORT_KEY值的键A来读取),您可以使用类似下面的内容:

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(); 
    } 
}