C# 使用带后台处理的USB RFID读卡器输入
我有一个大学项目,我必须在后台使用RFID阅读器来跟踪员工的入/出时钟。前台winform GUI处理日常事务,如订单、报价等。因此,我需要能够不间断地使用该程序,同时跟踪员工的来来往往。我已经调查了背景工作人员,一些新的趋势和输入抓取。但我似乎找不到任何有效的方法。RFID阅读器就像一个键盘,我可以得到它的名字。使用 RFID详细信息: 为了澄清,用户必须能够在不中断的情况下使用程序(多种形式),而RFID阅读器的任何输入必须记录在后台列表中C# 使用带后台处理的USB RFID读卡器输入,c#,winforms,background-process,hid,rfid,C#,Winforms,Background Process,Hid,Rfid,我有一个大学项目,我必须在后台使用RFID阅读器来跟踪员工的入/出时钟。前台winform GUI处理日常事务,如订单、报价等。因此,我需要能够不间断地使用该程序,同时跟踪员工的来来往往。我已经调查了背景工作人员,一些新的趋势和输入抓取。但我似乎找不到任何有效的方法。RFID阅读器就像一个键盘,我可以得到它的名字。使用 RFID详细信息: 为了澄清,用户必须能够在不中断的情况下使用程序(多种形式),而RFID阅读器的任何输入必须记录在后台列表中 我是新的背景工作者,多线程和输入抓取,所以我会感谢
我是新的背景工作者,多线程和输入抓取,所以我会感谢一些详细的帮助。另外,请询问是否需要我方提供更多详细信息。多线程不是很容易。BackgroundWorker在GUI上稍微容易一些,但仍然很难从后台任务中访问GUI。为什么不先尝试一下
任务/Await
?这避免了多线程,并且仍然可以运行两个任务。我这里有一个RFID阅读器,一个NordicID Sampo,它带有一个API,可以触发一个读取数据的线程。通过创建一个任务,从该线程添加的缓冲区中读取数据,可以在此基础上进行构建。然后,您可以将该数据传递到表单或通过电子邮件发送给它或其他任何内容
您的扫描仪可能有类似的机制
示例:StartStreaming是设备API的包装器,它触发读取设备数据的线程
class RFIDReader : IDisposable
{
public void StartStreaming()
{
if (RFID_ConnectSerialPort(mAPIHandle, 4, 115200) == 0 || RFID_ConnectAutoUSB(mAPIHandle) == 0)
{
RFID_StartInventoryStreaming(
(value, antenna) => {
mAntennas[antenna].Add(value);
});
}
}
/////// MORE FUNCTIONS
}
启动自己的任务并定期检查数据的客户端代码:
static void Main(string[] args)
{
Action a = new Action(() =>
{
using (RFIDReader scanner = new RFIDReader())
{
scanner.StartStreaming();
while (true)
{
foreach (string s in scanner.GetData(0))
{
WriteLine($"antenna0: {s}");
}
Thread.Sleep(1000);
}
}
});
Task t = Task.Factory.StartNew(a);
t.Wait();
}
如果您正在使用
你可以对这个问题做出反应。因此,在轮询新数据时可以避免阻塞。如果选择轮询,aproach@Servé已经向您展示了如何将其发送到另一个任务以避免阻塞主线程
下面是使用DataReceivedEvent的建议解决方案
初始化USB设备:
IUsbDevice wholeUsbDevice = PhysicalLibUSBDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
// This is a "whole" USB device. Before it can be used,
// the desired configuration and interface must be selected.
// Select config #1
wholeUsbDevice.SetConfiguration(1);
// Claim interface #0.
wholeUsbDevice.ClaimInterface(0);
}
// Create the reader and writer streams
_libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01);
_libUsbWriter = PhysicalLibUSBDevice.OpenEndpointWriter(LibUsbDotNet.Main.WriteEndpointID.Ep02);
_libUsbReader.DataReceived += OnDataReceived;
_libUsbReader.DataReceivedEnabled = true;
_libUsbReader.ReadThreadPriority = System.Threading.ThreadPriority.Highest;
_libUsbReader.ReadBufferSize = 32;
定义Eventhandler:
private void OnDataReceived(object sender, EndpointDataEventArgs e)
{
//Use the Buffer and Count Properties of the EventArgs to get the received data
Console.WriteLine("Data received");
}
你有密码吗?如果没有任何代码,这将太广泛…您是否已经使用设备成功读取了一些C#格式的RFID?然后请发布您已经尝试过的代码。因为他正在使用支持async/await的.NET4.5。如果他使用的是早期的.NET版本,他需要一些库,比如AsyncBridge。即使异步/等待和任务简化了并行编程,它仍然是多线程的。在使用多线程轮询RFID阅读器之前,我建议尝试对USB设备的接收事件做出反应,如果使用的USB lib支持此选项。True。我不会使用旧版本的.Net。任务花了我一段时间来获取概念,但现在我比实际的多线程要好很多。请考虑使用。然后需要.NET 4.5,在生产代码中,我将保存同步上下文,并使用它来更新GUI螺母。在4.5中,只需调用配置等待。