Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使RFID读卡器连续寻卡_C#_Rfid_Writer_Reader - Fatal编程技术网

C# 如何使RFID读卡器连续寻卡

C# 如何使RFID读卡器连续寻卡,c#,rfid,writer,reader,C#,Rfid,Writer,Reader,一段时间以来,我一直在尝试让我的RFID阅读器自动读取(扫描)卡。虽然前一个代码我有,使读者扫描卡时,按下一个按钮。但我希望能够自动连续扫描卡片,一旦任何卡片被放置在现场。这是我试过的。但我无法在文本框中显示扫描的UID。谢谢你的帮助 class CardReader : IDisposable { IntPtr _pSnr = Marshal.AllocHGlobal(1024); private Thread _t; private

一段时间以来,我一直在尝试让我的RFID阅读器自动读取(扫描)卡。虽然前一个代码我有,使读者扫描卡时,按下一个按钮。但我希望能够自动连续扫描卡片,一旦任何卡片被放置在现场。这是我试过的。但我无法在文本框中显示扫描的UID。谢谢你的帮助

 class CardReader : IDisposable
    {

        IntPtr _pSnr = Marshal.AllocHGlobal(1024);
        private Thread _t;
        private Action<string> _callback;
        private volatile bool _stop;

        public void ReadCard()
        {
            short icdev = 0x0000;
            int status;
            byte type = (byte)'A';//mifare one type is A 
            byte mode = 0x26;  // Request the card which is not halted.
            ushort TagType = 0;
            byte bcnt = 0x04;//mifare  hold on 4
            IntPtr pSnr;
            byte len = 255;
            sbyte size = 0;
            pSnr = Marshal.AllocHGlobal(1024);
            for (int i = 0; i < 2; i++)
            {
                status = rf_request(icdev, mode, ref TagType);//request card  
                if (status != 0)
                    continue;

                status = rf_anticoll(icdev, bcnt, pSnr, ref len);//i did anticol--get the card sn
                if (status != 0)
                    continue;

                status = rf_select(icdev, pSnr, len, ref size);//select one card
                if (status != 0)
                    continue;

                byte[] szBytes = new byte[len];

                for (int j = 0; j < len; j++)
                {
                    szBytes[j] = Marshal.ReadByte(pSnr, j);
                }

                String m_cardNo = String.Empty;

                for (int q = 0; q < len; q++)
                {
                    m_cardNo += byteHEX(szBytes[q]);
                }

                _callback(m_cardNo);

               // txtSearchPurse.Text = m_cardNo;

                break;
            }
        }

        public void Work()
        {
            while (!_stop)
            {
                ReadCard();
                Thread.Sleep(1000);
            }
        }

        public void Start(Action<string> cardRead)
        {
            if (_t != null)
                return;

            _stop = false;

            _callback = cardRead;

            _t = new Thread(Work);
            _t.Start();
        }

        public void Stop()
        {
            if (_t != null)
            {
                _stop = true;
                _t.Join();
                _t = null;
            }
        }

        public void Dispose()
        {
            Marshal.FreeHGlobal(_pSnr);
        }
    }
}以下是我尝试过的。但我无法在文本框中显示扫描的UID

那么你的回调成功触发了?如果有错误,您得到了什么?我猜你有一个“交叉线程异常”。如果是,请按如下方式进行修复:

 private void btnRequest_Click(object sender, EventArgs e)  
    {
     var reader = new CardReader();
     reader.Start(CardReaded);
}
private void CardReaded(string cardnr){
//txtSearchPurse.Text = _callback;
    private void CardReaded(string cardnr)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtSearchPurse.Text = cardnr;
        });        
    }

@懒散的头脑。尽管读卡器正在寻求连续扫描,但如何使卡片只扫描一次。因此,无论卡片在读卡器上停留多长时间,都只需扫描一次。谢谢。我自己从来没有用过阅读器。有文件吗?如何检测卡何时离开场?如果没有,我想不出一个可靠的方法,除了在一段时间内忽略来自同一个“cardnr”的通知。