从WinForm应用程序中读取Mifare 1k

时间:2013-05-27 11:07:44

标签: c# smartcard mifare

从WinForm应用程序中读取Mifare 1k卡时,我有一个非常奇怪的问题。我正在使用的读卡器是PROMAG PCR-310U智能卡读卡器。  我用这段代码来读卡片:

MifareReader.CommPort = 4;
MifareReader.PortOpen = true;
MifareReader.mfRequest();
MessageBox.Show(MifareReader.mfAnticollision().ToString());
MifareReader.mfHalt();

代码放在backgroundWorkers DoWork方法中,整个方法如下所示:

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        while (!worker.CancellationPending)
        {
            MifareReader.CommPort = 4;
            MifareReader.PortOpen = true;
            MifareReader.mfRequest();
            CardID = MifareReader.mfAnticollision().ToString();                
            MifareReader.mfHalt();
            if (CardID != "0" && CardID != string.Empty)
            {
                e.Result = CardID;
                worker.CancelAsync();
                break;
            }
        }
    }

我正在使用的是PROMAG PCR-310U智能卡读卡器和GNetPlus以及MifareReader dll。我有一个父表单创建子表单的应用程序。该子表单读取智能卡的ID并将其发送给父级。问题是这个 - 我第一次创建子表单时,读取过程完美地工作但是第二次(以及之后每次)创建子项,读取器停止工作 - 它返回“0”作为CardID是否卡是否存在。什么可能导致此错误,我将如何解决它?

1 个答案:

答案 0 :(得分:1)

最有可能的问题是:

关闭第一个子表单后,MifareReader实例未被处理或以其他方式知道不再需要它。这意味着它仍然控制着阅读器,显然这会阻止访问试图访问该阅读器的所有其他实例 一个这样的被阻止的实例是您打开的 second 子窗体中的MifareReader实例。

尝试通过PortOpen = false;关闭端口告诉第一个实例不再需要它。