首页 文章

如何使用RFID阅读器获取RFID标签上印刷的序列号?

提问于
浏览
1

如何通过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

我想要这个号码,但我不知道如何转换它 .

1 回答

  • 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>
    

    请注意,您也可以使用直接在控制台上接收此表单

    Serial.write(i);
    

    而不是 Serial.print(i, DEC);

    因此,您的阅读器通过发送传输开始(STX)字符(0x02)开始输出序列号,并结束发送带有传输结束(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;
                }
            }
        }
    }
    

相关问题