[英]Issue reading smart card
我的讀者哪個文檔幾乎與此一樣: http : //www.jinmuyu.com/download/JMY680A_EN.pdf主要區別在於,我的讀者聲稱它也支持TYPE B卡。
我有三張ISO 14443卡,我連續測試,並遵循以下代碼:
byte[] rs = null;
Thread.Sleep(500);
// Set module Idle
Random r = new Random();
byte rInt = (byte) r.Next(0, 255);
rs = send(new byte[] { 0x12, rInt });
if (rs[1] == 0xED)
throw new Exception("Failed set idle");
Thread.Sleep(500);
//// Request B
//rs = send(new byte[] { 0x60, 0x00, 0x00 });
//if (rs[1] == 0x9F)
// throw new Exception("Failed card requestB");
// RequestA
rs = send(new byte[] { 0x20, 0x00 });
if (rs[1] == 0xDF)
throw new Exception("Failed card requestA");
// Reset cardA
rs = send(new byte[] { 0x30 });
if(rs[1] == 0xCF)
throw new Exception("Failed card reset");
// Do other work, Send some APDU to card, etc.
// ........
// Exit program
大多數情況下,此代碼適用於所有三張卡。 但是,有時,當我將其中一張卡帶到閱讀器附近時,卡請求A( RequestA
呼叫)呼叫將失敗。 然后它會一直失敗,直到我把一張新卡帶到讀卡器。 有誰知道是什么原因造成的? 也許我需要在通話之間有一些延遲? 或者在調用RequestA
之前需要調用其他一些( ISO14443相關的 )函數?
send
是使用SerialPort
類實現的方法。 通過以下方式:
SerialPort
對象 Open
Write
和Read
一些數據 Close
連接 順便說一句。 這是RequestA命令中其中一張卡(讀卡器失敗一次)的成功響應:
ID | ATQ | SAK
0xe1 0x8f 0x68 0xe6 0x04 0x00 0x28
我無法確定您的代碼是什么問題,但是當連接出現錯誤而沒有打開新連接時,這似乎是一個問題。 由於SerialPort是您需要處理dispose的硬件資源,因此SerialPort可能實現IDisposable,這意味着您可以使用以確保連接已關閉並處理掉。 帶一張新卡可能會這樣做,但是當你使用同一張卡時,你仍然在處理故障狀態的串口。
當您將cardA帶到讀卡器附近時,它會失敗。 之后,每次將cardA帶到讀卡器附近時都會失敗。
我不確定,但我猜它什么時候失敗第二個位置的字節數組rs[1]
包含失敗的代碼。 因此,之后每次將cardA帶到讀卡器附近時都會失敗,因為字節數組第二個位置可能具有先前的值。
因此,請嘗試清除可能解決問題的字節數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.