首页 > 解决方案 > 无法检索添加到 1k Mifare Classic 标签的 390 个字符的文本记录

问题描述

我在1k Mifare Classic卡中添加了一条390字符长的文本记录,我可以成功写入,但读取时记录为空。我将 NDEF 库与 PN532 和 Ardunio uno 一起使用。

我的代码:

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

void setup()
{
Serial.begin(115200);
Serial.println("Serial Start");
nfc.begin();
Serial.println("NFC Start");
}

void loop()
{
if (nfc.tagPresent()) {
NfcTag tag = nfc.read();
tag.print();
}
if (nfc.tagPresent()) {
NdefMessage message = NdefMessage();
message.addTextRecord("denemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemeden");

    bool   success = nfc.write(message);
    if (success)
    {
        Serial.println("Write Success");
    }
    else
    {
        Serial.println("Error");
    }
}
}

我使用此处显示的示例,但它不起作用。

标签: c++arduinonfcndefpn532

解决方案


您在标签中添加文本“记录”的代码是正确的。然而,从标签读取消息有效负载不是。到达“记录”需要更多的时间。返回一个由消息对象组成的标签对象,该nfc.read()对象可能包含多个记录,并且在每个记录中,它具有有效负载长度和有效负载(即您添加的文本节点),需要进行一些解析才能获取您的数据写进去。

请注意,数据存储的前缀表示用于编码记录的字符集,我添加了代码以丢弃前缀,记录存储在 中byte,需要将其转换为char之前Serial.print()

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

void setup()
{
  Serial.begin(115200);
  Serial.println("Serial Start");
  nfc.begin();
  Serial.println("NFC Start");
}

void loop()
{
  // read from the tag for NDEF message payload
  char tagMsg[100]={'\0'};  // make sure this is longer than your added text
  if (nfc.tagPresent()) {
    NfcTag tag = nfc.read();
    if (tag.hasNdefMessage()) {    // an empty tag won't have any message
       NdefMessage message = tag.getNdefMessage();
       NdefRecord record = message.getRecord(0);  // only get the first records
       int payloadLength = record.getPayloadLength();
       uint8_t payload[payloadLength];
       record.getPayload(payload);
       // drop the first 3 bytes, which specify the language e.g. en=English
       for (uint8_t s = 3, d=0; s < payloadLength; s++, d++) {
         tagMsg[d] = (char)payload[s];
       }
       Serial.println(tagMsg);  //this will be the text msg you added
    }
  }

  // add a text message to the NDEF tag
  if (nfc.tagPresent()) {
    NdefMessage message = NdefMessage();
    message.addTextRecord("denemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemeden");

    if (nfc.write(message))
    {
        Serial.println("Write Success");
    }
    else
    {
        Serial.println("Error");
    }
  }
}

推荐阅读