You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一RFID标签在RC522与便携式阅读器读取ID不一致求助

RFID阅读器ID转换问题

我在全网查找相关信息,已在Stack Overflow搜索类似议题但未能解决。我的RC522 RFID模块连接在Raspberry PI4上,扫描标签得到ID:397829713198;使用便携式阅读器扫描同一标签得到ID:2910822492。我尝试过转十六进制、排列组合、反转、转二进制等操作均无效,请问如何通过便携式阅读器的ID得到树莓派读取的ID?

树莓派侧读取代码

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import time
import multiprocessing

GPIO.setwarnings(False)

reader = SimpleMFRC522()
max_runtime = 10  # 最大运行时间(秒)

def read_rfid():
    try:
        id, text = reader.read()
        print(id)
    except KeyboardInterrupt:
        pass

def main():
    start_time = time.time()
    rfid_process = multiprocessing.Process(target=read_rfid)
    rfid_process.start()

    while rfid_process.is_alive():
        current_time = time.time()
        elapsed_time = current_time - start_time

        if elapsed_time >= max_runtime:
            rfid_process.terminate()
            rfid_process.join()
            break

if __name__ == "__main__":
    try:
        main()
    finally:
        GPIO.cleanup()

转换方法

两个ID的差异源于读取的字节范围和端序不同,具体转换步骤如下:

  1. 将便携式阅读器ID转十六进制
    把2910822492转为十六进制:B08A8C5C(拆分后是0xB0 0x8A 0x8C 0x5C)
  2. 补全RC522读取的完整UID
    RC522会读取4字节UID+1字节校验位(校验位是前4字节的异或值),计算校验位:0xB0 ^ 0x8A ^ 0x8C ^ 0x5C = 0x0A,完整字节序列为B0 8A 8C 5C 0A
  3. 反转字节序列并转十进制
    反转字节得到0A 5C 8C 8A B0,将该十六进制串转为十进制,结果就是397829713198,与树莓派读取的ID一致。

验证转换的Python代码

portable_id = 2910822492
# 转8位十六进制字符串
hex_str = f"{portable_id:08X}"
# 拆分每两个字符为一个字节
bytes_list = [hex_str[i:i+2] for i in range(0, 8, 2)]
# 计算校验位
checksum = hex(int(bytes_list[0],16) ^ int(bytes_list[1],16) ^ int(bytes_list[2],16) ^ int(bytes_list[3],16))[2:].upper().zfill(2)
# 拼接反转后的字节和校验位并转十进制
full_hex = "".join([checksum] + bytes_list[::-1])
pi_id = int(full_hex, 16)
print(f"转换后的树莓派读取ID:{pi_id}")

内容的提问来源于stack exchange,提问作者thesimon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:16:03