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