日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一种射频卡读写原理及实现

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一种射频卡读写原理及实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=95408

非接觸式IC卡又稱射頻卡,由IC芯片、感應(yīng)天線組成,封裝在一個標準的PVC卡片內(nèi),芯片及天線無任何外露部分。是世界上最近幾年發(fā)展起來的一項新技術(shù),它成功的將射頻識別技術(shù)和IC卡技術(shù)結(jié)合起來,結(jié)束了無源(卡中無電源)和免接觸這一難題,是電子器件領(lǐng)域的一大突破。卡片在一定距離范圍(通常為5-10mm)靠近讀寫器表面,通過無線電波的傳遞來完成數(shù)據(jù)的讀寫操作。

  1 硬件結(jié)構(gòu)與工作原理

  本課題中射頻卡采用業(yè)界廣泛使用的由荷蘭飛利浦公司生產(chǎn)的M1卡,M1卡主要有射頻天線和ASIC兩部分組成,如圖1。射頻天線是由特制的磁感線圈繞制而成,用來接收讀卡器發(fā)出的固定頻率的電磁波。ASIC主要由高速射頻RF接口、數(shù)據(jù)讀寫控制單元、存儲工具EEPROM構(gòu)成。當讀卡器對射頻卡進行讀寫操作時,讀卡器會持續(xù)發(fā)出一組頻率固定的電磁波,電磁波的頻率與M1卡內(nèi)置的LC諧振模塊的諧振頻率相同,從而造成LC諧振模塊發(fā)生共振,使諧振電路的電容內(nèi)產(chǎn)生電荷,這個電容通過特殊的傳輸裝置單向傳輸?shù)搅硗庖粋€電容聚集起來。當積累的電荷電壓達到2 V時,此電荷實際上可以作為一個電源向卡內(nèi)的各種電路裝置供電,從而實現(xiàn)讀卡器對射頻卡的讀寫操作。

  高速射頻RF接口的主要功能是用來接收通過LC諧振電路產(chǎn)生的電源電壓以及諧振電路本身的復(fù)位信號和時鐘信號。數(shù)據(jù)讀寫控制單元的主要功能是對射頻接口傳遞的數(shù)據(jù)進行調(diào)制和解密并對數(shù)據(jù)按照特定的步驟與讀卡器進行數(shù)據(jù)的交互處理。讀卡器與計算機連接的串口初始化成功后,就開始在讀卡器射頻感應(yīng)的工作范圍內(nèi)尋找射頻卡。如果同時感應(yīng)到多張射頻卡,讀卡器會啟動反沖突機制控制模塊選定其中的一張。選定要處理的卡之后,讀寫器就確定要訪問的扇區(qū)號,并對該扇區(qū)密碼進行密碼校驗,在3次相互認證之后就可以通過加密流進行通訊,對讀卡器進行讀寫操作,操作成功后啟動報警控制模塊,提示操作成功,同時掛起該張卡。EEPROM是射頻卡的存儲單元,用來保存讀卡器寫入的信息。M1射頻卡存儲空間是8 KB。存儲空間分為16個扇區(qū),每個扇區(qū)又分為4個塊,每個塊內(nèi)存大小為16 B。64個塊按物理排序命名,序號從0塊一直到63塊。其中0塊保存的是射頻卡的序列號,出廠時由廠家直接寫入,不能更改。另外,每個扇區(qū)的第4塊是該扇區(qū)的密碼存儲塊,其中包括兩套密碼以及密碼讀取控制字節(jié)。其余3塊是數(shù)據(jù)塊,可以存儲數(shù)據(jù)并進行相應(yīng)數(shù)據(jù)操作,如圖2所示。

  2 軟件設(shè)計流程與程序?qū)崿F(xiàn)

  基于射頻卡使用環(huán)境及對數(shù)據(jù)處理實時性的特殊要求,必然要求讀卡器處于一種不間斷的監(jiān)測狀態(tài),能夠?qū)M入讀卡器感應(yīng)區(qū)域的射頻卡進行快速穩(wěn)定的數(shù)據(jù)采集,并把這種處理結(jié)果實時傳輸給相連的計算機,通過專門的軟件進行信息的交互處理[4]。考慮到這些要求,在軟件的設(shè)計過程中使用C#中的timer控件來滿足這種要求,利用Timer控件的定時激發(fā)功能,使讀卡器能夠不間斷地檢測是否有卡進入感應(yīng)區(qū)域。首先初始化串口,保證讀卡器和計算機的正常連接,如果讀卡器沒有檢測到有射頻卡處于工作區(qū),就一直保持檢測狀態(tài)。如果讀卡器檢測到工作范圍內(nèi)有卡,就按照正常讀寫操作流程(如圖3)對射頻卡進行操作,一張卡操作完成后,讀卡器會自動報警提示操作成功并掛起這張卡。在這種情況下,除非把這張卡移除工作區(qū),否則讀卡器將無法繼續(xù)正常工作。

  在分析了射頻卡的工作原理和軟件流程后,本文用C#語言來編寫具體的程序代碼,C#是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\行于。NET Framework之上的高級程序設(shè)計語言[5]。為了便于產(chǎn)品的開發(fā),廠家已經(jīng)附帶給出了開發(fā)射頻卡程序所需要的動態(tài)連接庫。C#語言可以直接調(diào)用給動態(tài)連接庫,只需要在程序中加以引用說明即可。本課題采用的讀卡器為雙面D8讀卡器,附帶的動態(tài)鏈接庫文件為dcrf32.dll。此文件中包含了常用的射頻卡讀寫操作等系列函數(shù)。實現(xiàn)對射頻卡寫數(shù)據(jù)操作的部分關(guān)鍵代碼如下:

  …

  [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("超過規(guī)定的數(shù)據(jù)長度,寫入失敗");

  txtN.Text = null;

  return;

  }

  if (sex.Length > 16)? //數(shù)據(jù)長度檢測

  {

  MessageBox.Show("超過規(guī)定的數(shù)據(jù)長度,寫入失敗");

  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); //關(guān)閉串口

  }

  private void timer1_Tick(object sender, EventArgs e)

  //定時器操作

  {

  timer1.Interval = 1000;

  timer1.Start();

  Card_Read();

  }

  實驗結(jié)果表明,運用C#語言結(jié)合定時器的特有功能編寫的射頻卡讀寫程序工作穩(wěn)定,很好的滿足工程需求。在讀卡器對射頻卡進行讀寫操作的同時,并不影響軟件系統(tǒng)其他模塊的操作,具有較強的實用意義。


總結(jié)

以上是生活随笔為你收集整理的一种射频卡读写原理及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。