2016-05-03 13 views
-2

私はRFIDカードを読んでいて、カードがリーダーを通過するとIDを比較しようとしているので、リーダーは実際にそれを2回以上読み取るので、uint32_t型のC++の等価性が比較されない

更新日:

uint32_t priorTag = 0000000; 
tag = IndentifyTag(entryRFIDReader); 

if (tag == priorTag) 
{    
    Serial.println("These tags are the same!!!"); 
} 
if (tag != priorTag) 
{ 
    Serial.println("I got here!"); 
    tagCount += 1; 
} 
priorTag = tag; 
SSerial.println("tagCount = "); Serial.println(tagCount); 

問題があっても次のとおりです。次のコードは、IDの

uint32_t IndentifyTag(Adafruit_PN532 rfidReader) 
{ 
    uint8_t tagID[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID 
    uint8_t tagIDLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) 
    uint32_t cardid = tagID[0]; 
    boolean success = rfidReader.readPassiveTargetID(PN532_MIFARE_ISO14443A, &tagID[0], &tagIDLength); 
    if (success) { 
     // Display some basic information about the card for testing 
     Serial.println("Found an ISO14443A card"); 
     Serial.print(" UID Length: "); Serial.print(tagIDLength, DEC);  Serial.println(" bytes"); 
     Serial.print(" UID Value: "); rfidReader.PrintHex(tagID, tagIDLength); 

     if (tagIDLength == 4) 
     { 
      // Mifare Classic card 
      cardid <<= 8; 
      cardid |= tagID[1]; 
      cardid <<= 8; 
      cardid |= tagID[2]; 
      cardid <<= 8; 
      cardid |= tagID[3]; 
      Serial.print("Mifare Classic card #"); 
      Serial.println(cardid); 
     } 
     Serial.println(""); 
    } 
    return cardid; 
} 

、次のようにswitch文の場合には、私は平等のためのタグをテストしていカードを取得します1回のパスで同じカードを3回または4回読み取ると、それらは決して等しくないので、tagCounterはダプをカウントしています。 tagとpriorTagは両方ともuint32_t型であるため、==と比較できるはずですが、このコンテキストでは動作しません。

 
Found an ISO14443A card 
UID Length: 4 bytes 
UID Value: 0x92 0x77 0x88 0xBB 
Mifare Classic card #7833787 

I got here! 
tagCount = 1 
Found an ISO14443A card 
UID Length: 4 bytes 
UID Value: 0x92 0x77 0x88 0xBB 
Mifare Classic card #7833787 

I got here! 
tagCount = 2 
Found an ISO14443A card 
Mifare Classic card #7833787 

I got here! 
tagCount = 3 
Found an ISO14443A card 
Mifare Classic card #7833787 

I got here! 
tagCount = 4 
+1

コードの該当部分がありません。 priorTagが宣言されている場所はわかりません。たぶんそれはループの中で宣言されているので、各ループの反復の始めに常に値0を持つことになります。 – NineBerry

+0

@NineBerry ...それが宣言された、あなたはそれを逃した。 – dinotom

+1

いいえ、あなたは誤解しました。問題は、コードの文脈で宣言されているところです。 – NineBerry

答えて

1

変数priorTagは、ループ内にローカルすぎると宣言されています。したがって、各反復の開始時には常に値0が使用されます。

変数priorTagの宣言をループ外に移動します。

+0

元の質問には表示されなかったループ。 :/ –

+0

まだ実際には表示されていません。 – user4581301

+0

@ナインおそらく2番目のコードブロックの最初の3行を表示する方が良いでしょう。'tag == priorTag'が真と評価する唯一の時間は、' IdentifyTag'が0を返す時です。 –

4
priorTag = tag; 
Serial.println("******************************"); 
Serial.print("Prior tag: "); Serial.println(priorTag); 
Serial.print("Current tag: "); Serial.println(tag); 

あなたは、コードのこれらの4行が実行され得るとき、あなたはおそらく今まで、ここで印刷された2つの異なる値を見ることができる方法を説明できますか?

+0

良い点、タグ番号が同じではないにもかかわらず、何が起こっているのか誤って間違った場所に置いているのを見るためにそれらのシリアルステートメントを追加しました== – dinotom

+1

Cosmic rayストライキが少し反転した。おそらく、しかし可能です。 – user4581301

+1

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - ***質問が変更されるまで(/レビュー/低品質・ポスト/ 12234877) –