如何使用dotnet/iot的Mfrc522库读取树莓派连接的NFC标签数据
问题解决方案
一、树莓派3B+无法识别任何卡片问题修复
- 先确认树莓派SPI接口已启用:执行
raspi-config,在「Interface Options」中找到SPI选项,选择开启后重启设备 - 修正SPI设备编号:你当前代码使用
SpiConnectionSettings(0, 1)对应SPI0的CE1引脚,而Python的SimpleMFRC522库默认使用SPI0的CE0(BCM编号8脚),如果你的RC522的CE引脚接的是BCM8,需要将配置改为SpiConnectionSettings(0, 0) - 确认引脚编号规则:dotnet/iot的GpioController默认使用BCM编号,你需要确认你接线的RST引脚对应的BCM编号确实是22,而非BOARD编号的22
- 增加手动复位逻辑:初始化Mfrc522前先手动触发复位,避免库自动复位失效,代码参考:
gpioController.OpenPin(pinReset, PinMode.Output); gpioController.Write(pinReset, PinValue.Low); Thread.Sleep(50); gpioController.Write(pinReset, PinValue.High); Thread.Sleep(50); // 再初始化Mfrc522 mfrc522 = new(spi, pinReset, gpioController, false);
二、树莓派计算模块4认证失败问题修复
- 修正认证逻辑:Mifare 1K卡每4个块为一个扇区,每个扇区仅需要认证1次,无需每个块都发起认证请求,频繁发起认证会触发卡片的防冲突机制导致认证失败,调整逻辑为按扇区遍历,每个扇区认证成功后连续读取该扇区的4个块
- 修正卡号输出逻辑:
card.NfcId是字节数组,不能直接用UTF8编码转字符串,改为BitConverter.ToString(card.NfcId).Replace("-", "")输出十六进制格式的卡号 - 调整重试逻辑:认证失败后不要仅调用
ReselectCard(),需要重新执行寻卡流程获取新的卡片实例,再进行认证尝试 - 降低SPI时钟频率:将
connection.ClockFrequency调整为1_000_000,部分RC522模块在高频SPI下通信不稳定,容易出现校验错误导致认证失败 - 增加卡片挂起操作:每次完成单张卡片的读写操作后,调用
mfrc522.HaltA()将卡片挂起,避免残留状态影响后续的识别和认证 - 确认卡片密钥:如果使用的不是空白卡,需要替换代码中的默认密钥为你卡片实际对应的KeyA/KeyB,不要直接使用库提供的默认密钥
内容的提问来源于stack exchange,提问作者Helga Schneider
相关产品推荐
相关产品推荐

