树莓派Ruby RFID读取程序:添加循环解决未检测卡的CommunicationError
解决Ruby读取RFID时无卡触发CommunicationError的持续检测问题
嘿,我来帮你搞定这个问题!你的核心需求是让程序持续检测RFID卡片,而不是一没卡就报错退出对吧?原来的代码里rescue retry其实只会在第一次捕获错误时重试一次,但并没有形成持续循环,而且没有明确指定捕获的异常类型,容易掩盖其他问题。
下面是调整后的代码,能实现持续检测卡片的功能:
#!/usr/bin/env ruby require 'mfrc522' class Rfid def read_uid r = MFRC522.new # 创建无限循环持续检测 loop do begin # 发送请求命令唤醒附近的RFID卡片 r.picc_request(MFRC522::PICC_REQA) # 选中卡片并获取UID和SAK值 uid, sak = r.picc_select puts "El seu identificador es: " puts "%02x%02x%02x%02x" % uid return uid # 成功读取到UID后返回,退出循环 rescue MFRC522::CommunicationError # 捕获无卡时的通信错误,给出提示并延迟后继续检测 puts "等待RFID卡片,请将卡片靠近阅读器..." sleep 0.5 # 延迟0.5秒,避免占用过多CPU资源 end end end end if __FILE__ == $0 rf = Rfid.new uid = rf.read_uid end
关键改动说明:
- 添加无限循环:用
loop包裹整个读取逻辑,让程序持续尝试检测卡片,直到成功读取到UID才退出。 - 明确捕获特定异常:只捕获
MFRC522::CommunicationError,这个异常就是无卡或通信失败时抛出的,避免捕获其他意外错误(比如库初始化失败)导致程序无响应。 - 增加延迟和提示:在捕获错误后添加
sleep 0.5,减少树莓派的CPU占用,同时打印提示信息让用户知道程序在正常工作。
额外小提示:
- 确保树莓派已经开启SPI接口(可以通过
raspi-config的Interfacing Options里开启)。 - 检查RFID阅读器的接线是否正确(SDA、SCK、MOSI、MISO、GND、VCC对应引脚)。
- 如果还是有不稳定的情况,可以尝试更新
mfrc522Ruby库:gem update mfrc522
内容的提问来源于stack exchange,提问作者Anna Garcia
相关产品推荐
相关产品推荐

