2013-09-24 3 views
0

У меня есть программа, которая записывает данные на USB-устройство HID. Когда данные принимаются с устройства USB, я получаю обратный вызов из библиотеки usblib через событие делегирования DataRecievedEventHandler.Слушайте синхронные обратные вызовы с C#

Я привык к программированию на прошивке с прерываниями, так что я могу сделать

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, совпадает с this one. В 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; 
} 
+0

Можете ли вы представить фактический код в 'sendUsbData' и код что обновляет 'receivedFlagRaised'? – meilke

+0

there you go @meilke – chwi

+0

Вы когда-нибудь получали обратный вызов? Плюс: 'receivedFlagRaised' не' receiveComplete'. – meilke

ответ

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 (int i = 0; i > 16; i++) 
{ 
    sendUsbData(array[i]); 

    // wait for member wait handle to be set 
    waitHandle.WaitOne(); 
} 
+0

Имею ли я доступ к 'waitHandle', когда он создается таким образом, как в методе ? – chwi

+0

Вам нужно определить элемент. – meilke

+0

И вот где вы меня потеряли: P – chwi

Смежные вопросы