射频识别(RFID)技术

实验:读写器控制

作者:陈广 日期:2019-2-17


本次实验通过编程获取 HR8002 读写器相关信息,控制读卡器蜂鸣器及 LED 灯,掌握 HBLib 类库的基本使用方式。

连接读写器

使用读写器

将读写器 USB 接口插入电脑,安装 USB 转串口驱动程序。驱动下载地址:http://www.rfidhb.com/rfid/rive/145.html。如果此驱动安装不成功,也可使用驱动精灵或 360 驱动大师等软件进行安装。安装成功后,可打开 Windows 的【设备管理器】查看【端口项】,如下图所示:

图 1:在设备管理器查看读卡器信息

上图中红框部分就是读卡器,请记住它的串口的端口号(我的电脑是 COM3),等下编程时要用到。

使用模拟程序

(暂时省略)

引入 NuGet 包

打开 Visual Studio,新建一个控制台应用程序... (暂时省略,等生成 NuGet 包后再补充)

编程获取读写器信息

输入如下代码:

using System;
using System.Threading.Tasks;
using HBLib;
using HBLib.HR8002Reader;

namespace CmdDemo
{
    class Program
    {
        static ComPort com = new ComPort("COM3", 19200, 1000);

        static void Main(string[] args)
        {
            com.Open();
            GetReaderInformation();

            Console.ReadLine();
        }

        private static async Task GetReaderInformation()
        {   //获取阅读器参数
            Reader reader = new Reader(0x00, com);
            var info = await reader.GetReaderInformationAsync(0x00);
            Console.WriteLine("发送的字节:" + info.GetSendByteStr());
            Console.WriteLine("接收的字节:" + info.GetRecvByteStr());
            Console.WriteLine();
            Console.WriteLine("版本号:" + info.GetVersionStr());
            Console.WriteLine("读写器类型:" + info.GetReaderTypeStr());
            Console.WriteLine("读写器支持的协议类型:" + info.GetProtocolTypeStr());
            Console.WriteLine("询查命令最大响应时间:" + info.GetInventoryScanTime().TotalSeconds + "秒");
        }
    }
}

运行结果如下:

发送的字节:05 00 00 00 76 6D
接收的字节:0C 00 00 03 49 00 00 66 00 0E 14 F0 00

版本号:03.73
读写器类型:HR8002
读写器支持的协议类型:ISO15693,ISO14443A,ISO14443B
询查命令最大响应时间:2秒

我们可以看到,HBLib 的使用非常简单,连串口都已经包装好了。你在本次通信中需要的所有信息都可以通过返回值访问到,甚至包括本次通讯发送和接收的字节。由于 ISO14443A 协议是半双工协议,即一问一答形式,上位机发起请求,然后读写器响应,所以这里使用了异步编程模型。在进行一系列操作时,异步编程使用起来无疑是非常方便的。代价就是你在使用时不得不将它包装成方法进行调用,如果使用 UI,还得专门开线程去运行它。当然,如果使用的是 .NET Core,则可以在 Main 方法中加入async关键字,此时调用会方便些。

static ComPort com = new ComPort("COM3", 19200, 1000);

这句代码创建一个串口:

  • 第一个参数表示串口号,填入我们刚才在【设备管理器】中看到的相应的串口号。
  • 第二个参数是波特率,HR8002 读写器使用的波特率是 19200。
  • 第三个参数是命令等待时间,单位为毫秒。由于 HR8002 使用半双工通信协议,采用一问一答的形式,上位机每发送一个命令都会等待读写器返回信息,如果发送的命令出错,有时读写器并不返回任何信息。所以不能无限期等待消息的返回,所以需要设置一个最大等待时间。我这里设置的是 1 秒的最大等待时间,其实 300 毫秒应该就可以了。
Reader reader = new Reader(0x00, com);

要发送控制读写器的相关命令,使用Reader类就可以了,在创建Reader类,构造函数的第一个参数是读写器地址,如果无法确定读写器地址,请填入0xFF。第二个参数就是刚才创建的串口类com,上位机使用它与读写器进行串口通信。

进行一系列操作

上一个例子,我们只调用了一个命令,而在实际项目中往往需要一次性调用一系列的命令。接下来我们演示如何调用一系列命令。设计的场景是将读写器设置为 ISO14443A 模式,如果成功,则蜂鸣器响 5 声,LED 灯闪 5 次。

更改代码如下:

static ComPort com = new ComPort("COM3", 19200, 1000);

static void Main(string[] args)
{
    com.Open();
    ChangeToISO14443A();

    Console.ReadLine();
}

private static async Task ChangeToISO14443A()
{   //获取阅读器参数
    Reader reader = new Reader(0x00, com);
    var info = await reader.ChangeToISO14443AAsync(); //将读写器更改为 ISO14443A 模式
    if (info.ReturnValue != ReturnMessage.Success)
    {
        Console.WriteLine("改写失败!");
        return;
    }
    Console.WriteLine("成功将读写器更改为 ISO14443A 模式!");
    await reader.BeepAsync(5, 5, 5); //蜂鸣器响 5 声
    await reader.SetLEDAsync(5, 5, 5); //LED 灯闪 5次
}

运行程序,可听到蜂鸣器响 5 声,LED 灯红绿交替闪烁 5 次。

本示例演示了一系列命令的使用方式,由于使用了异步编程,所以使用多个命令会非常方便,等待一个命令信息返回后才会执行下一个命令。可通过返回值的ReturnValue属性来判断命令是否执行成功。BeepAsyncSetLEDAsync方法中:

  • 第一个参数表示打开时间,单位是 50ms,则参数 5 表示打开 250 毫秒。
  • 第二个参数表示关闭时间,单位是 50ms, 参数 5 表示关闭 250 毫秒。
  • 第三个参数表示重复次数,一开一关表示一次。

这里需要注意,实际项目中,鸣叫或灯闪的时间不易设置太长。读写器本身也是一个单片机,并未实现命令的多线程执行,虽然读写器在接收到命令后会立即返回,但在蜂鸣器和 LED 动作期间,它无法接受其它命令。一般情况下执行一次 250 毫秒足矣。我在写BeepAsyncSetLEDAsync这两个方法时已经让线程休眠动作执行所需的时间之后,再返回,所以没有出错。有兴趣的同学可以自行编写底层代码,尝试在蜂鸣器动作期间执行其它命令,查看能否成功执行。

;

© 2018 - IOT小分队文章发布系统 v0.3