我正在尝试使用Arduino Uno从带有SL018屏蔽的MIFARE卡中读取特定块。写它没有问题,但对于我和同学正在研究的项目,我们需要能够读取输入(即使是0或1就足够了)。
使用我们在网上找到的库和代码,我们来到了这段代码:
/**
* 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 :(得分:0)
查看SL018库的example code。您可以使用串行终端使用代码的用户界面。如果你想阅读一个标签,那么有趣的部分是第111行的case 'R':
(阅读部门)。
action = READ;
// specify what to read
block = 0;
numBlocks = 16;
// tag has to be selected first
rfid.selectTag();
定义块后,您可以阅读它。
答案 1 :(得分:0)
鉴于您引用了块,并且您似乎认为在调用printArrayHex()
时块中包含16个字节,我假设您尝试读取MIFARE Classic 卡。
您首先要等待标签:
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卡的整个内存(假设所有块都可以使用带有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();
}
}