【问题标题】:How to make RFID reader seek for card continously如何让RFID读写器连续寻卡
【发布时间】:2017-05-28 06:35:10
【问题描述】:

一段时间以来,我一直在尝试让我的 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);
        }
    }

我试着像这样使用它:

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

}

【问题讨论】:

    标签: c# rfid writer reader


    【解决方案1】:

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

    所以你的回调成功触发了?你得到了什么错误,如果有的话?我猜你有一个“跨线程异常”。如果是这样,请像这样修复它:

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

    【讨论】:

    • @Idle_Mind。请问我怎样才能使卡片只被扫描一次,尽管读卡器正在寻求连续扫描。因此,无论卡片在读卡器上停留多长时间,都只扫描一次。谢谢。
    • 我自己从未真正使用过阅读器。有文件吗?如何检测卡片何时离开场地?如果没有,除了在一段时间内忽略来自同一“cardnr”的通知之外,我想不出一种可靠的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多