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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 02:54:40