当前位置RFID世界网 > 技术文章 > 制造 > 正文

基于C#的射频卡读写原理及实现

作者:张可可 来源:微型机与应用 2012-03-23 09:09:54

摘要:介绍了射频卡的硬件结构和工作原理,给出了一套对射频卡进行数据采集和实时处理的软件设计方案,并采用C#语言编写了关键的程序代码。

关键词:射频卡[69篇]   读卡器[0篇]  定时器[0篇]   动态链接库[0篇]  

  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.

12

 已有0条评论 我要评论 联系编辑 分享到:网易新浪腾讯人人开心网豆瓣MSN


最新评论(加载最新评论):


上一篇:非接触式Mifarel卡预付费智能水表设计

下一篇:基于ARM的非接触IC卡网络系统


相关文章:


关键字搜索:


新闻中心:射频卡[32篇]   读卡器[0篇]  定时器[0篇]   动态链接库[0篇]  

成功应用:射频卡[6篇]   读卡器[0篇]  定时器[0篇]   动态链接库[0篇]  

解决方案:射频卡[12篇]   读卡器[0篇]  定时器[0篇]   动态链接库[0篇]  


图片文章:

热点专题