2 软件设计流程与程序实现
基于射频卡使用环境及对数据处理实时性的特殊要求,必然要求读卡器处于一种不间断的监测状态,能够对进入读卡器感应区域的射频卡进行快速稳定的数据采集,并把这种处理结果实时传输给相连的计算机,通过专门的软件进行信息的交互处理[4].考虑到这些要求,在软件的设计过程中使用C#中的timer控件来满足这种要求,利用Timer控件的定时激发功能,使读卡器能够不间断地检测是否有卡进入感应区域。首先初始化串口,保证读卡器和计算机的正常连接,如果读卡器没有检测到有射频卡处于工作区,就一直保持检测状态。如果读卡器检测到工作范围内有卡,就按照正常读写操作流程(如图3)对射频卡进行操作,一张卡操作完成后,读卡器会自动报警提示操作成功并挂起这张卡。在这种情况下,除非把这张卡移除工作区,否则读卡器将无法继续正常工作。
在分析了射频卡的工作原理和软件流程后,本文用C#语言来编写具体的程序代码,C#是微软公司发布的一种面向对象的、运行于。NET Framework之上的高级程序设计语言[5].为了便于产品的开发,厂家已经附带给出了开发射频卡程序所需要的动态连接库。C#语言可以直接调用给动态连接库,只需要在程序中加以引用说明即可。本课题采用的读卡器为双面D8读卡器,附带的动态链接库文件为dcrf32.dll.此文件中包含了常用的射频卡读写操作等系列函数。实现对射频卡写数据操作的部分关键代码如下:
- …
- [DllImport("dcrf32.dll")]
- public static extern int dc_init(short port, int baud);
- [DllImport("dcrf32.dll")]
- public static extern short dc_request(int icdev, char _Mode, ref uint TagType);
- [DllImport("dcrf32.dll")]
- public static extern short dc_select(int icdev, uint _SecNr, byte[] _Size);
- [DllImport("dcrf32.dll")]
- public static extern short dc_authentication(int icdev, int _Mode, int _SecNr);
- [DllImport("dcrf32.dll")]
- public static extern int dc_beep(int icdev, short _Msec);
- [DllImport("dcrf32.dll")]
- public static extern int dc_pro_halt(int icdev);
- [DllImport("dcrf32.dll")]
- public static extern short dc_exit(int icdev);
- private void Card_Read();
- {
- _icdev=dc_init(Form3.Com, Form3.botelv);
- //串口初始化
- if (_icdev <= 0)
- {MessageBox.Show(“串口初始化失败!");
- return;
- }
- byte[] name = System.Text.Encoding.Default.GetBytes
- (txtN.Text);
- byte[] sex = System.Text.Encoding.Default.GetBytes
- (txtS.Text);
- if (name.Length > 16)
- {
- MessageBox.Show("超过规定的数据长度,写入失败");
- txtN.Text = null;
- return;
- }
- if (sex.Length > 16) //数据长度检测
- {
- MessageBox.Show("超过规定的数据长度,写入失败");
- txtS.Text = null;
- return;
- }
- int st;
- ulong icCardNo = 0;
- char tt = (char)0;
- st = dc_card(IcDev, tt, ref icCardNo); //寻卡操作
- if (st != 0)
- { txtCardId.Text = "";
- txtN.Text = "";
- txtS.Text = "";
- MessageBox.Show("寻卡失败!");
- return;
- }
- int sector = 0;
- st = dc_authentication(IcDev, 0, sector); //密码验证
- if (st != 0)
- {
- MessageBox.Show("验证密码失败!");
- return;
- }
- try
- {
- string dt = txtS.Text;
- st = dc_write(IcDev, 2, dt); //射频卡写操作
- dc_beep(IcDev, 10); //蜂鸣操作
- st=dc_halt(IcDev) ; //挂起操作
- MessageBox.Show("修改成功");
- }
- catch
- {
- MessageBox.Show("更改卡中信息失败");
- }
- dc_exit(IcDev); //关闭串口
- }
- private void timer1_Tick(object sender, EventArgs e)
- //定时器操作
- {
- timer1.Interval = 1000;
- timer1.Start();
- Card_Read();
- }
实际应用结果表明,采用C#语言结合定时器的特有功能编写的射频卡读写控制程序运行稳定,能够很好地满足工作现场的需要。在读卡器对射频卡进行读写操作的同时,并不影响软件系统其他模块的操作,具有较强的实用意义。
参考文献
[1] 杨瑞,彩虹。射频卡多线程读写原理及其实现[J].计算机与信息技术,2006(2):1-3.
[2] 苏明强,刘伟。高性价比的MIFARE卡读写模块的设计。 [J].微计算机信息,2006,22(5-2):1-2.