脚本如何检测RFID读写是否正常

wen 实用脚本 27

本文目录导读:

脚本如何检测RFID读写是否正常

  1. 基础检测流程
  2. 通用检测脚本 (Python例)
  3. 不同接口的检测方法
  4. 常见故障排查
  5. 简易版「一键检测」命令(Windows/Linux)

检测RFID读写器是否正常,通常需要从硬件连接驱动状态通信协议以及实际读写操作四个层面进行,具体实现方式取决于你使用的编程语言(如Python、C#、Java)和硬件接口(如USB串口、网络TCP/IP)。

以下是通用的检测逻辑和示例脚本(以最常见的 Python + USB串口 RFID模块 为例):

基础检测流程

一个稳健的检测脚本应包含以下步骤:

  1. 端口发现与连接测试:检查设备是否在系统上被识别。
  2. 握手/固件版本查询:发送特定指令,验证模块是否响应。
  3. 寻卡测试:尝试寻找附近的电子标签(卡片)。
  4. 读写测试:对已知卡片进行一次完整的读/写操作。
  5. 压力与稳定性测试:循环操作多次,观察成功率。

通用检测脚本 (Python例)

假设你使用的是USB转串口的RFID读写器(如基于MFRC522、R2000或类似模块),协议为Modbus RTU私有协议

import serial
import serial.tools.list_ports
import time
import sys
# --- 配置区 ---
# 根据你的设备修改以下参数
RFID_BAUDRATE = 115200       # 常见:9600, 19200, 115200
RFID_DEVICE_VID_PID = "1A86:7523"  # 可选:根据VID:PID过滤(例如CH340芯片)
TEST_CARD_TIMEOUT = 3        # 寻卡超时时间(秒)
READ_CMD = b"\xA0\x03\x00\x00\x00\x01\xC4\x29" # 示例:读取固件版本(需替换为设备实际指令)
FIND_CARD_CMD = b"\xA0\x03\x00\x01\x00\x01\xD4\x29" # 示例:寻卡(需替换)
# --- 配置结束 ---
def find_rfid_port():
    """自动发现可能的RFID串口(通过VID:PID或端口描述)"""
    ports = serial.tools.list_ports.comports()
    for port in ports:
        # 方法1:通过VID:PID(推荐)
        if hasattr(port, 'vid') and port.vid is not None:
            vid_pid = f"{port.vid:04X}:{port.pid:04X}"
            if vid_pid == RFID_DEVICE_VID_PID:
                return port.device
        # 方法2:通过描述关键词(备用)
        if "RFID" in port.description.upper() or "COM" in port.description.upper():
            return port.device
    return None
def send_command(ser, cmd, response_len=7):
    """发送指令并接收响应(根据你的协议重写)"""
    try:
        ser.write(cmd)
        time.sleep(0.1)
        if response_len > 0:
            response = ser.read(response_len)
            return response
        return b"OK"
    except Exception as e:
        return None
def check_rfid_health():
    """主检测函数"""
    print("=== RFID读写器健康检测脚本 ===")
    # Step 1: 寻找并打开端口
    port = find_rfid_port()
    if not port:
        print("[FAIL] 未发现RFID设备,请检查: 1)USB连接 2)驱动安装")
        return False
    print(f"[OK] 发现设备端口: {port}")
    try:
        ser = serial.Serial(port, RFID_BAUDRATE, timeout=1)
        print(f"[OK] 串口连接成功 (波特率: {RFID_BAUDRATE})")
    except serial.SerialException as e:
        print(f"[FAIL] 无法打开串口: {e}")
        return False
    # Step 2: 发送握手/查询固件版本
    print("\n测试1: 固件版本查询...")
    resp = send_command(ser, READ_CMD, response_len=7)
    if resp and len(resp) > 0:
        # 具体解析取决于协议,这里仅判断是否有响应
        print(f"[PASS] 收到设备响应: {resp.hex()}")
    else:
        print(f"[WARN] 未收到预期响应,但可能是协议不匹配,继续下一步...")
    # Step 3: 测试寻卡功能(需要放一张卡片在读写器上)
    print("\n测试2: 寻卡测试...")
    print(f"请在 {TEST_CARD_TIMEOUT} 秒内将卡片靠近读写器...")
    start_time = time.time()
    card_found = False
    while time.time() - start_time < TEST_CARD_TIMEOUT:
        # 发送寻卡指令(根据实际协议)
        resp = send_command(ser, FIND_CARD_CMD, response_len=7)
        if resp and len(resp) >= 6:
            # 假设响应中第4-5字节表示卡片UID长度或标志
            if resp[3] == 0x04:  # 示例:如果返回不同表示有卡
                uid = resp[4:8]  # 取出UID
                card_found = True
                print(f"[PASS] 找到卡片! UID: {uid.hex().upper()}")
                break
        time.sleep(0.1)
    if not card_found:
        print(f"[WARN] 未在超时内找到卡片,请检查: 1)天线是否正常 2)卡片类型是否支持")
        # 不返回False,因为也可能是无卡环境
    # Step 4: 读写测试(如果有卡片)
    if card_found:
        print("\n测试3: 读写测试...")
        # 演示:向块0x00写入数据(危险操作!实际请选用户区)
        # 示例写入 "AABB"
        write_cmd = b"\xA0\x04\x00\x00\x00\x02\xAA\xBB\xC4\x29" # 需实际计算CRC
        # send_command(ser, write_cmd)
        # 然后读取并验证
        time.sleep(0.5)
        print("[INFO] 读写测试执行完成 (详细校验请根据具体协议实现)")
    # Step 5: 关闭连接
    ser.close()
    print("\n=== 检测完成 ===")
    # 如果基本通信成功,视为正常
    return True
if __name__ == "__main__":
    result = check_rfid_health()
    sys.exit(0 if result else 1)

不同接口的检测方法

接口类型 检测重点 脚本示例
USB串口 检查 /dev/ttyUSB0 (Linux) 或 COM3 (Windows) 是否存在;发送 ATVersion 命令 如上Python示例
以太网/TCP 使用 ping 检测IP连通性;用 socket 发送 Modbus TCP 或自定义指令 s.connect(('192.168.1.100', 6000))
Wiegand接口 通常无法主动脚本检测,需通过串口转Wi-Fi模块或逻辑分析仪 使用GPIO中断监听数据线
USB HID 使用 pyusb 库检测设备是否注册 usb.core.find(idVendor=0x...)

常见故障排查

如果脚本检测失败,请按以下顺序排查:

  1. 权限问题
    • Linux: sudo chmod 666 /dev/ttyUSB0 或加入 dialout 组。
    • Windows: 检查设备管理器是否显示“感叹号”。
  2. 协议不匹配
    • 制造商不同(如RG-522、LR2000、F800A等),指令集差异巨大。
    • 使用串口监视软件(如 SSCOM、Putty)先手动发送 00 01 等查看回复。
  3. 电源不足

    部分大功率RFID模块需要独立5V/12V供电,USB供电可能无法驱动天线。

  4. 天线故障

    如果串口通信正常但读不到卡,可能是天线未接或阻抗不匹配。

简易版「一键检测」命令(Windows/Linux)

不写脚本,直接使用系统命令快速检查:

  • Windows (PowerShell):

    # 列出所有串口
    # 尝试连接并发送数据(需要 .NET)
    $port = new-Object System.IO.Ports.SerialPort "COM3", 9600, None, 8, one
    $port.open()
    $port.WriteLine("VERSION\r\n")
    $port.ReadLine()
    $port.close()
  • Linux:

    # 查看是否识别
    dmesg | grep -i rfid
    lsusb | grep -i rfid
    # 直接用 echo 测试(需要先设置波特率)
    stty -F /dev/ttyUSB0 115200
    echo -n -e "\xA0\x03\x00\x00\x00\x01" > /dev/ttyUSB0
    cat /dev/ttyUSB0 | xxd

脚本检测的核心逻辑是找到设备 -> 打开端口 -> 发送特定命令 -> 验证响应是否符合预期,由于RFID设备协议非常碎片化,你需要查阅对应设备的用户手册,找到以下信息:

  • 查询固件版本的指令和CRC算法。
  • 寻卡指令的返回格式(UID长度、检验位)。
  • 读写卡的命令格式。

如果你能提供具体的RFID模块型号,我可以给出更精确的检测脚本。

抱歉,评论功能暂时关闭!