树莓派4B上USB RFID读卡器(EF4100 125kHz)读取ID后程序停滞的问题求助
树莓派4B上USB RFID读卡器(EF4100 125kHz)读取ID后程序停滞的问题求助
看起来你的程序每次读卡都会重复输出ID,但卡在循环里不继续执行,主要是代码里的几个细节问题导致的,我帮你拆解分析:
问题1:字符串错误调用hex()方法
你的ID是通过拼接数字字符得到的字符串,但你写了ID.hex().upper()——字符串类型根本没有hex()方法,这会触发异常!虽然你用了try-except捕获,但可能异常输出被Thonny的调试信息淹没,或者程序报错后没有正确退出循环,导致看起来像是“停滞”。
问题2:打印语句位置错误
你把打印ID的代码放在了for c in buffer的循环内部,这意味着每读取一个按键字符就会打印一次ID,而不是等整个10位ID读取完成后再输出,这会造成“重复读卡”的假象。
问题3:循环退出逻辑不严谨
当检测到结束标志ENDFLAG(对应回车键)时,你设置了READING = False,但没有立刻跳出内部的for循环,可能会继续处理buffer里的其他无关字符,影响循环退出的时机。
修正后的代码
我帮你调整了代码,解决了这些问题,还添加了调试信息方便排查:
NUMBERS = {30: '1', 31: '2', 32: '3', 33: '4', 34: '5', 35: '6', 36: '7', 37: '8', 38: '9', 39: '0'} ENDFLAG = 40 # 对应HID键盘的回车键码 def read_rfid(): try: with open('/dev/hidraw0', 'rb') as f: print("Tedd oda a kartyat") READING = True ID = "" while READING: buffer = f.read(8) print("正在读取数据块...") for c in buffer: if c == ENDFLAG: # 读取到结束标志,退出所有循环 READING = False print(f"Kartya szama: {ID}") break # 跳出内部for循环,不再处理当前buffer的剩余字符 elif c > 0 and c in NUMBERS: # 只处理有效数字按键码 ID += NUMBERS[c] except Exception as e: print(f"Hiba: {e}") # 打印详细异常堆栈,方便调试 import traceback traceback.print_exc() if __name__ == "__main__": read_rfid() print("程序已完成读取,退出函数")
额外注意事项
- 权限问题:访问
/dev/hidraw0需要足够权限,确保你的Pi用户属于input组,执行命令sudo usermod -aG input pi,然后重启或重新登录。 - 调试建议:如果还是有问题,看Thonny的控制台输出,
traceback.print_exc()会帮你显示详细的错误位置,方便定位问题。
备注:内容来源于stack exchange,提问作者McCo
相关产品推荐
相关产品推荐

