Arduino 无法使用SL018从MIFARE的特定块读取字节

Arduino 无法使用SL018从MIFARE的特定块读取字节,arduino,nfc,arduino-uno,rfid,mifare,Arduino,Nfc,Arduino Uno,Rfid,Mifare,我正在尝试使用Arduino Uno从带有SL018屏蔽的MIFARE卡读取特定块。写它没有问题,但对于我和一个同学正在做的项目,我们需要能够阅读输入(即使是0或1也足够了) 使用我们在网上找到的库和代码,我们得到了以下代码: /** * Arduino to SL018/SL030 wiring: * A4/SDA 2 3 * A5/SCL 3 4 * 5V 4 - * GND 5 6 * 3

我正在尝试使用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();
}
/**
*Arduino至SL018/SL030接线:
*A4/SDA 2 3
*A5/SCL 3 4
*5V 4-
*GND 5 6
*3V3-1
*/
#包括
#包括
字节块=0x01;
SL018射频识别;
无效设置()
{
Wire.begin();
连载《开始》(19200);
//提示输入标记
Serial.println(“显示您的标签”);
}
void循环()
{
seekTag();
而(!rfid.available());
串行打印(“块”);
打印十六进制(块);
连续打印(“:”);
printArrayHex(rfid.getBlock(),16);
连续打印(“”);
printarayascii(rfid.getBlock(),16);
Serial.println();
}
有人知道我们如何阅读代码块1中的特定部分吗?

看看SL018库的这一部分。您可以将代码的用户界面与串行终端一起使用。如果您想读取标记,则在第111行的输入部分是
大小写'R':
(读取扇区)

action = READ;
// specify what to read
block = 0;
numBlocks = 16;
// tag has to be selected first
rfid.selectTag();
定义块之后,您就可以阅读它了。

看看SL018库的这一部分。您可以将代码的用户界面与串行终端一起使用。如果您想读取标记,则在第111行的输入部分是
大小写'R':
(读取扇区)

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

定义块之后,您就可以读取它了。

鉴于您引用的是块,并且在调用
printarayhex()
时,您似乎假设块由16个字节组成,我假设您尝试读取MIFARE经典卡

您将首先等待标记:

rfid.seekTag();
while (!rfid.available());
然后,您可以对要读取的扇区进行身份验证。例如,要读取块号5(位于扇区1中),您需要对扇区1进行身份验证。假设此扇区的密钥A设置为默认值(
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_键值的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();
    }
}
for(字节扇区=0;扇区<16;++扇区){
//使用密钥类型A和密钥传输密钥对当前扇区进行身份验证
验证(扇区,0xAA,传输密钥);
用于(字节块=0;块<4;++块){
读块(扇区*4+块);
连续打印(“扇区”);
连续打印(扇区);
连续打印(“,块”);
串行打印(块);
连续打印(“:”);
printArrayHex(rfid.getBlock(),16);
Serial.println();
}
}

鉴于您引用了块,并且在调用
printArrayHex()
时似乎假设块由16个字节组成,我假设您尝试读取MIFARE经典卡

您将首先等待标记:

rfid.seekTag();
while (!rfid.available());
然后,您可以对要读取的扇区进行身份验证。例如,要读取块号5(位于扇区1中),您需要对扇区1进行身份验证。假设此扇区的密钥A设置为默认值(
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_键值的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();
    }
}
for(字节扇区=0;扇区<16;++扇区){
//使用密钥类型A和密钥传输密钥对当前扇区进行身份验证
验证(扇区,0xAA,传输密钥);
用于(字节块=0;块<4;++块){
读块(扇区*4+块);
连续打印(“扇区”);
连续打印(扇区);
连续打印(“,块”);
串行打印(块);
连续打印(“:”);
printArrayHex(rfid.getBlock(),16);
Serial.println();
}
}