c# - 如何让RFID阅读器读取直到得到结果

标签 c#

这是我第一次尝试编写 RFID 阅读器代码。

我有下面的代码,当我点击一个按钮读取卡 ID 时,我想让代码不断读取,直到有人将卡放在读卡器上,然后根据放在上面的卡做一些事情。

     private void btnRequest_Click(object sender, EventArgs e)  
    {

        txtSearchPurse.Text = "";
        short icdev = 0x0000;
        int status;
        byte type = (byte)'A';//mifare one type is A 卡询卡方式为A
        byte mode = 0x26;  // Request the card which is not halted.
        ushort TagType = 0;
        byte bcnt = 0x04;//mifare 卡都用4, hold on 4
        IntPtr pSnr;
        byte len = 255;
        sbyte size = 0;


        if (!bConnectedDevice)
        {
            MessageBox.Show("Not connect to device!!", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }

        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);//防冲突得到返回卡的序列号, anticol--get the card sn
            if (status != 0)
                continue;

            status = rf_select(icdev, pSnr, len, ref size);//锁定一张ISO14443-3 TYPE_A 卡, 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]);
            }
            txtSearchPurse.Text = m_cardNo;                

            break;
        }

        Marshal.FreeHGlobal(pSnr);
    }

此代码来自制造商,我对它的实际作用知之甚少。

任何信息都会很好。

最佳答案

是这样的吗? 它将读卡代码放在一个线程上,间隔为 1 秒。 一旦卡片被读取,您的代码就会被调用,您可以处理卡片。 只是一个让您入门的示例,还有很多需要改进的地方。

    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 卡询卡方式为A
            byte mode = 0x26;  // Request the card which is not halted.
            ushort TagType = 0;
            byte bcnt = 0x04;//mifare 卡都用4, hold on 4
            IntPtr pSnr;
            byte len = 255;
            sbyte size = 0;

            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);//防冲突得到返回卡的序列号, anticol--get the card sn
                if (status != 0)
                    continue;

                status = rf_select(icdev, pSnr, len, ref size);//锁定一张ISO14443-3 TYPE_A 卡, 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);

                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);                
        }
    }

用法:

var reader = new CardReader();
reader.Start(CardReaded); 

private void CardReaded(string cardnr){
...
}

关于c# - 如何让RFID阅读器读取直到得到结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754129/

相关文章:

c# - 使用 STA 和 COM 的 VSTO 后台线程

c# - 有哪些协议(protocol)可以与 WCF 一起使用?

c# - 使用存储库模式但没有工作单元构建单页应用程序 - 在哪里保存更改?

c# - 在 C# 中将小数舍入到最接近的四分之一

c# - 如何在 C# 中使用 CppCodeProvider 编译 C++ 代码

c# - 通过 Socket 从 C++ 到 C# 的 Protobufer

c# - 如何取消Backgroundworker中的DoWork

c# - Unicode 字符串到二进制字符串和二进制字符串到 unicode c#

c# - Breeze Web API,每个层次继承结构具有非常简单的表

c# - 对于在 WPF 中构建这样的控件,您有何建议?