C# 听C语言的同步回调#
我有一个将数据写入USB HID设备的程序。当从USB设备接收到数据时,我通过委托事件从C# 听C语言的同步回调#,c#,callback,synchronous,C#,Callback,Synchronous,我有一个将数据写入USB HID设备的程序。当从USB设备接收到数据时,我通过委托事件从usblib库获得回调datareceivedeventhandler 我习惯于在固件上进行中断编程,因此我可以 while(!flag); // Will continue when interrupt triggers and change the flag 我想将一个数组元素逐个写入USB,并在每个数组元素之后等待设备返回 for (int i = 0; i > 16; i++) {
usblib
库获得回调datareceivedeventhandler
我习惯于在固件上进行中断编程,因此我可以
while(!flag); // Will continue when interrupt triggers and change the flag
我想将一个数组元素逐个写入USB,并在每个数组元素之后等待设备返回
for (int i = 0; i > 16; i++)
{
sendUsbData(array[i]);
while(!receivedComplete);
// Wait for response from USB before transmitting next iteration
}
问题是当我在while
循环中后台处理时,回调不会被触发。对如何进行此类操作有何建议
我用于USB通信的库与相同。在SpecifiedDevice.cs中有一个名为public void SendData(byte[]data)
的方法,我正在使用该方法发送字节数组
传输方式:
public void sendUsbData(byte _txData)
{
byte[] txData = new byte[this.usb.SpecifiedDevice.OutputReportLength];
txData[1] = 0x50; // 0x50 = loopback command. Element 0 is always 0x00
int pos = 2;
foreach (byte b in _flashData)
{
txData[pos] = b;
pos++;
}
this.usb.SpecifiedDevice.SendData(txData);
}
从USB接收数据后,将调用回调USB_onDataReceived
private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
{
this.ParseReceivePacket(args.data); // Format to string and print to textbox
/*public bool*/receiveComplete = true;
}
您可以切换到使用
AutoResetEvent
等待句柄:
public void sendUsbData(byte _txData)
{
byte[] txData = new byte[this.usb.SpecifiedDevice.OutputReportLength];
txData[1] = 0x50; // 0x50 = loopback command. Element 0 is always 0x00
int pos = 2;
foreach (byte b in _flashData)
{
txData[pos] = b;
pos++;
}
// reset member wait handle
waitHandle = new AutoResetEvent(false);
this.usb.SpecifiedDevice.SendData(txData);
}
private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
{
this.ParseReceivePacket(args.data); // Format to string and print to textbox
// signal member wait handle
waitHandle.Set();
}
然后在for循环中:
for (int i = 0; i > 16; i++)
{
sendUsbData(array[i]);
// wait for member wait handle to be set
waitHandle.WaitOne();
}
您能否提供
sendUsbData
中的实际代码以及更新receivedFlagRised
的代码?您是否收到过回调?另外:receivedFlagRised
不是receiveComplete
@meilke我更改了命名,忘了在这里更新。我与之通信的加密狗将数据循环返回,我得到回调。因为我向fast发送数据,所以出现了一些问题,但我几乎得到了所有的数据作为回报(由于我给加密狗的命令字节),当它在方法中被实例化时,我是否能够访问waitHandle
?您需要定义一个成员。这就是您丢失我的地方:PLike您以前拥有的bool标志。等待手柄将取代它的位置。否。我知道您的USB库本身正在异步通信,并通过创建事件通知您。只要一次通信还在进行,你就想阻止你的代码。你需要使它再次同步。因此,AutoResetEvent
。