2016-06-07 126 views
1

如何通過RFID閱讀器獲取打印在RFID標籤上的序列號?如何使用RFID閱讀器獲取RFID標籤上打印的序列號?

我:

  • 的Arduino UNO,
  • RMD 6300閱讀器,以及
  • RFID標籤(125KHZ)。

我使用下面的代碼:

#include <SoftwareSerial.h> 
SoftwareSerial RFID(2, 3); // RX and TX 

int i; 

void setup() 
{ 
    RFID.begin(9600); // start serial to RFID reader 
    Serial.begin(9600); // start serial to PC 
} 

void loop() 
{ 
    if (RFID.available() > 0) 
    { 
    i = RFID.read(); 
    Serial.print(i, DEC); 
    Serial.print(" "); 
    } 
} 

我得到這個值:

2 48 57 48 48 50 69 52 69 65 50 67 66 3 

但下面的值被打印在RFID標籤:

0003034786 

我會想要這個號碼,但我不知道如何轉換它。

+0

我猜可能嗎? http://stackoverflow.com/questions/11848921/arduino-rfid-checksum-calculation-and-key-visualization – jmercier

回答

2

您當前得到的值是編碼爲US-ASCII字符串的序列號。十進制(正如您當前打印)值是

 
2 48 57 48 48 50 69 52 69 65 50 67 66 3 

將這些字節爲十六進制形式(更好的可讀性)導致:

 
02 30 39 30 30 32 45 34 45 41 32 43 42 03 

US-ASCII編碼這些字節導致此字符串:

 
<STX>09002E4EA2CB<ETX> 

請注意,您也可以通過使用

0直接接收您的控制檯上的這種形式
Serial.write(i); 

代替Serial.print(i, DEC);

因此,讀者開始通過發送啓動傳輸的-(STX)字符(0×02)輸出的序列號,並結束與結束傳輸發送序列號( ETX)字符。之間的一切是序列號(表示爲十六進制字符):

 
09002E4EA2CB 

印在鍵(0003034786)的序列號是唯一的完整的序列號的一小部分。該值是十進制表示。如果轉換

 
0003034786 

其十六進制表示,你

 
002E4EA2 

此值包含在您從閱讀器接收的序列號:

 
09002E4EA2CB 

因此,可以按照這樣的方式打印該值(如果需要前導零,則使用sprintf()):

void loop() { 
    int serialNumber = 0; 
    int charIndex = 0; 
    int currentChar; 

    if (RFID.available() > 0) { 
     currentChar = RFID.read(); 
     ++charIndex; 
     if (currentChar == 0x002) { 
      charIndex = 0; 
      serialNumber = 0; 
     } else if (currentChar == 0x003) { 
      Serial.print(serialNumber, DEC); 
      Serial.print(" "); 
     } else { 
      if ((charIndex >= 1) && (charIndex < 5)) { 
       serialNumber <<= 8; 
       serialNumber += currentChar; 
      } 
     } 
    } 
}