作者:陈广 日期:2019-2-17
本次实验通过编程获取 HR8002 读写器相关信息,控制读卡器蜂鸣器及 LED 灯,掌握 HBLib 类库的基本使用方式。
将读写器 USB 接口插入电脑,安装 USB 转串口驱动程序。驱动下载地址:http://www.rfidhb.com/rfid/rive/145.html。如果此驱动安装不成功,也可使用驱动精灵或 360 驱动大师等软件进行安装。安装成功后,可打开 Windows 的【设备管理器】查看【端口项】,如下图所示:
上图中红框部分就是读卡器,请记住它的串口的端口号(我的电脑是 COM3),等下编程时要用到。
(暂时省略)
打开 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);
这句代码创建一个串口:
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
属性来判断命令是否执行成功。BeepAsync
和SetLEDAsync
方法中:
这里需要注意,实际项目中,鸣叫或灯闪的时间不易设置太长。读写器本身也是一个单片机,并未实现命令的多线程执行,虽然读写器在接收到命令后会立即返回,但在蜂鸣器和 LED 动作期间,它无法接受其它命令。一般情况下执行一次 250 毫秒足矣。我在写BeepAsync
和SetLEDAsync
这两个方法时已经让线程休眠动作执行所需的时间之后,再返回,所以没有出错。有兴趣的同学可以自行编写底层代码,尝试在蜂鸣器动作期间执行其它命令,查看能否成功执行。