如何让RFIDreader连续寻卡

How to make RFID reader seek for card continously

一段时间以来,我一直在尝试让我的 RFID reader 自动读取(扫描)卡片。尽管我以前的代码在按下按钮时使 reader 扫描卡片。但是我希望能够在将任何卡片放置在现场时自动且连续地扫描卡片。这是我试过的。但我无法在文本框中显示扫描的 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);
        }
    }

我试过这样使用它:

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

}

这是我试过的。但是我无法在文本框中显示扫描的 UID。

你的回调成功了吗?你得到什么错误,如果有的话?我猜你有 "cross thread exception"。如果是这样,请像这样修复它:

    private void CardReaded(string cardnr)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtSearchPurse.Text = cardnr;
        });        
    }