首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用SL018从MIFARE的特定块中读取字节

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

Stack Overflow用户
提问于 2016-09-12 20:13:06
回答 2查看 733关注 0票数 1

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

使用一个库和一个我们在网上找到的代码,我们得到了这个代码:

代码语言:javascript
复制
/**
 *  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?

EN

回答 2

Stack Overflow用户

发布于 2016-09-13 02:20:44

看看这个SL018库的example code。你可以在串口终端上使用代码的用户界面。如果您想读取标记,则第111行的case 'R': (读取扇区)是感兴趣的部分。

代码语言:javascript
复制
action = READ;
// specify what to read
block = 0;
numBlocks = 16;
// tag has to be selected first
rfid.selectTag();

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

票数 0
EN

Stack Overflow用户

发布于 2016-09-13 06:34:37

如果您提到块,并且在对printArrayHex()的调用中似乎假设一个块由16个字节组成,那么我假设您尝试读取MIFARE Classic卡。

您首先需要等待一个标记:

代码语言:javascript
复制
rfid.seekTag();
while (!rfid.available());

然后,您可以向要读取的扇区进行身份验证。例如,要读取数据块编号5 (位于扇区1中),您需要向扇区1进行身份验证。假设此扇区的密钥A设置为默认值(FF FF FF FF FF FF),并配置为对数据块5进行读取访问,则可以使用:

代码语言:javascript
复制
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中的数据:

代码语言:javascript
复制
rfid.readBlock(5);
Serial.print("Block 5: ");
printArrayHex(rfid.getBlock(), 16);
Serial.println();

或者,如果您想读取MIFARE Classic 1K卡的整个内存(并假设所有块都可以使用带有TRANSPORT_KEY值的密钥A读取),您可以使用如下内容:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39450050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档