0

从 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 是否卡是否存在。什么可能导致此错误,我将如何解决它?

4

1 回答 1

1

最有可能的是,问题如下:

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

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

于 2013-05-29T08:32:17.633 回答