0

私は Arduino Uno と adaFruit PN532 ボードを使用しています。目標は、現在 NFC シールドの範囲内にある MiFare カードのリストを作成できるようにすることです。

ボードはループごとに 1 つのカードしか検出しないように見えるため、このロジックを記述する最善の方法を見つけるのに苦労しています。

ボードに 2 枚のカードを配置できますが、両方が表示されますが、ループごとに 1 枚しか表示されません。では、現在範囲内にあるものの現在のリストを作成するにはどうすればよいですか

私のループ:

 void loop()
{

  Serial.println("--------------------Loop begin-------------------");
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  uint8_t index =0;  
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

   if (success) {

    // Display some basic information about the card
    Serial.println("Found an ISO14443A card");
    Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("  UID Value: ");
    nfc.PrintHex(uid, uidLength);
    Serial.println("");

  }

   Serial.println("************************Loop END*********************");
}

両方のカードが範囲内にある場合のシリアル モニター出力は次のとおりです。

--------------------ループ開始-------------------

ISO14443A カードが見つかりました
UID 長さ: 4 バイト
UID 値: 0x13 0x99 0x1C 0xD4

********************** ループ END********************

--------------------ループ開始----------------------------------
ISO14443A カード
UID が見つかりました 長さ: 4 バイト
UID 値: 0x13 0x34 0x27 0xD4

********************** ループ END********************

4

1 に答える 1

0

(潜在的に複数の) UID を格納するには、ループの外側に何らかの状態 (ID フィールドと長さフィールドを持つ構造体の配列のようなもの) が必要です。readPassiveTargetIDのコードを見ると、カード ID が複数ある場合に返されるカード ID は少しランダムになる可能性が高いと思います。

ID を読み続け、配列をチェックして以前に見たことがあるかどうかを確認し、そうでない場合は保存する必要があると思います。次に、しばらくして (または配列のオーバーフローやその他のトリガー)、「最近」見た ID を出力し、配列を空にリセットできます (たとえば、長さフィールドをクリアすることにより)。

于 2014-09-04T09:24:05.323 に答える