我的读者的文档几乎与此完全相同: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
答案 0 :(得分:1)
我无法确定您的代码是什么问题,但是当连接出现错误而没有打开新连接时,这似乎是一个问题。由于SerialPort是您需要处理dispose的硬件资源,因此SerialPort可能实现IDisposable,这意味着您可以使用以确保连接已关闭并处理掉。带一张新卡可能会这样做,但是当你使用同一张卡时,你仍然在处理故障状态的串口。
答案 1 :(得分:0)
当您将cardA带到读卡器附近时,它会失败。之后,每次将cardA带到读卡器附近时都会失败。
我不确定,但我猜它什么时候失败第二个位置的字节数组rs[1]
包含失败的代码。因此,之后每次将cardA带到读卡器附近时都会失败,因为字节数组第二个位置可能具有先前的值。
因此,请尝试清除可能解决问题的字节数组。