如何用C#读取RFIDControllerMfrc522数据?求替代库及问题解决
解决Unosquare.RaspberryIO.Peripherals读取MFRC522数据异常问题及C# RFID库推荐
你当前代码的核心问题是扇区与块不匹配,以及未正确转换字节数据为可读内容:
- Mifare卡的扇区和块一一对应:每个扇区包含4个块,扇区0对应块0-3,扇区7对应块28-31。你认证了扇区7却读取块0,权限验证逻辑错误,导致返回无效数据。
- SimpleMFRC522默认将文本数据写入扇区1的块4-6,你需要对应读取正确的块。
- 直接输出字节数组的单个元素会显示ASCII码值,而非实际文本,需转换为字符串。
修复后的代码示例
using System; using System.Text; using System.Threading; using Unosquare.RaspberryIO; using Unosquare.RaspberryIO.Peripherals; class Program { static void Main() { Pi.Init<BootstrapWiringPi>(); var reader = new RFIDControllerMfrc522(); // 空白Mifare卡默认密钥,若你修改过密钥请替换 var defaultKey = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; while (true) { if (reader.DetectCard() == RFIDControllerMfrc522.Status.AllOk) { var uidResponse = reader.ReadCardUniqueId(); if (uidResponse.Status != RFIDControllerMfrc522.Status.AllOk) { Console.WriteLine("读取UID失败"); Thread.Sleep(1000); continue; } var cardUid = uidResponse.Data; reader.SelectCardUniqueId(cardUid); try { // 认证SimpleMFRC522默认写入的扇区1(对应块4-6) if (reader.AuthenticateCard1A(cardUid, 1, defaultKey) == RFIDControllerMfrc522.Status.AllOk) { // 读取块4(SimpleMFRC522默认写入的第一个数据块) var readResult = reader.CardReadData(4); if (readResult.Status == RFIDControllerMfrc522.Status.AllOk) { // 转换为ASCII字符串并去除末尾空字符 var cardContent = Encoding.ASCII.GetString(readResult.Data).Trim('\0'); Console.WriteLine($"读取到的数据:{cardContent}"); } else { Console.WriteLine($"读取数据失败:{readResult.Status}"); } } else { Console.WriteLine("扇区认证失败"); } } finally { reader.ClearCardSelection(); } } Thread.Sleep(1000); } } }
其他C# RFID库推荐
- MFRC522.Net:专为MFRC522设计的.NET库,支持.NET Core/.NET 5+,API简洁,覆盖读卡、写卡、密钥管理等全功能。
- Microsoft IoT.Device.Bindings:微软官方IoT设备绑定库,内置MFRC522实现,兼容性强,文档完善,适合融入.NET IoT生态。
- RaspberryPi.Net.MFRC522:轻量级库,专注于MFRC522基础操作,代码量小,易于自定义扩展。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

