0

USB HID デバイスにデータを書き込むプログラムがあります。USB デバイスからデータを受信するとusblib、デリゲート イベントを通じてライブラリからコールバックを受け取りますDataRecievedEventHandler

私は割り込みを使用してファームウェアでプログラミングすることに慣れているので、できるようになります

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_OnDataRecievedが呼び出されます。

private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
{
    this.ParseReceivePacket(args.data); // Format to string and print to textbox
    /*public bool*/receiveComplete = true; 
}
4

1 に答える 1

1

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();
}
于 2013-09-24T09:03:16.403 に答える