Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 听C语言的同步回调#_C#_Callback_Synchronous - Fatal编程技术网

C# 听C语言的同步回调#

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++) {

我有一个将数据写入USB HID设备的程序。当从USB设备接收到数据时,我通过委托事件从
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