树莓派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
相关产品推荐
相关产品推荐

