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

树莓派Python读取RFID卡输出乱码,无法识别卡号求助

解决RFID读卡器读取乱码问题

1. 先确认读卡器的设备类型

首先排查你的读卡器是串口设备还是HID键盘仿真设备:

  • 在树莓派终端执行 lsusb,查看读卡器的设备描述。如果显示类似Keyboard或HID标识,说明是键盘仿真设备,不需要用serial库,得用HID读取工具。
  • 如果是串口转USB设备,执行 ls /dev/tty*,对比插读卡器前后的设备列表,找到新增的设备(通常是/dev/ttyUSB0或/dev/ttyACM0),替换你代码里的/dev/tty1——tty1是系统控制台,不是USB串口设备。

2. 修正串口读取代码

如果确认是串口设备,用以下代码替换原代码:

import serial
import binascii

# 替换为你找到的正确串口路径
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
try:
    while True:
        # 读取整行数据(多数读卡器会以回车/换行结尾)
        data = ser.readline()
        if data:
            # 打印原始字节,方便分析
            print(f"原始字节: {data}")
            # 尝试多种编码解码,排查正确格式
            try:
                ascii_result = data.decode('ascii').strip()
                print(f"ASCII解码结果: {ascii_result}")
            except UnicodeDecodeError:
                gbk_result = data.decode('gbk', errors='ignore').strip()
                print(f"GBK解码结果: {gbk_result}")
            # 转十六进制字符串,便于对比卡面卡号
            hex_result = binascii.hexlify(data).decode('ascii')
            print(f"十六进制输出: {hex_result}")
finally:
    ser.close()

3. HID键盘仿真设备的处理

如果是HID设备,先安装依赖库:

sudo apt-get install python3-evdev

再用以下代码读取卡号:

from evdev import InputDevice, categorize, ecodes

# 用`ls /dev/input/`或`evtest`工具找到读卡器对应的event设备,替换eventX
dev = InputDevice('/dev/input/eventX') 

try:
    card_number = ""
    for event in dev.read_loop():
        if event.type == ecodes.EV_KEY:
            key_info = categorize(event)
            if key_info.keystate == key_info.key_down:
                # 映射键盘按键到数字
                key_map = {
                    ecodes.KEY_0: '0', ecodes.KEY_1: '1', ecodes.KEY_2: '2',
                    ecodes.KEY_3: '3', ecodes.KEY_4: '4', ecodes.KEY_5: '5',
                    ecodes.KEY_6: '6', ecodes.KEY_7: '7', ecodes.KEY_8: '8',
                    ecodes.KEY_9: '9'
                }
                if key_info.scancode in key_map:
                    card_number += key_map[key_info.scancode]
                # 多数读卡器读完卡号会发送回车,以此作为结束标志
                elif key_info.scancode == ecodes.KEY_ENTER:
                    print(f"读取到卡号: {card_number}")
                    card_number = ""
finally:
    dev.close()

4. 卡面卡号的对应分析

你卡面的卡号是0002859428043,41380,可以把这些数字转成十六进制,对比读取到的hex数据:
比如卡号里的28对应十六进制0x3238(ASCII编码的数字'2'和'8'),如果你的读取结果里有这类字节,说明读卡器输出的是ASCII格式的卡号;如果是0x28这类字节,可能是BCD码或其他协议格式,这时候建议查看读卡器说明书,确认它的输出协议(韦根、ASCII、BCD等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:40:19