2011-09-01 63 views
1

我正在使用HID設備連接到連接有幾種不同類型傳感器的CAN總線。其中一些響應很快,另一些則有更多的延遲。HID設備。最好的方法來做事件處理?

我在C#中使用這個USB HID組件作爲Visual Basic中的.dll,效果很好。 http://www.codeproject.com/KB/cs/USB_HID.aspx

我目前發送和接收命令的代碼有點麻煩。有時命令和發送但沒有收到足夠快。問題可能出在傳感器上,而不是實際的VB代碼。我們希望程序繼續監視其他傳感器,而不是掛起太久。

目前我正在使用事件處理程序和循環,但我想知道這是否可以通過線程更好地完成?或者我的例程對於這種情況來說是最好的。

代碼段:

CANUSB_Class.vb

Public Sub DataReceivedHandler(ByVal sender As Object, ByVal dataReceived As DataRecievedEventArgs) 
    For Each byteReceived As Byte In dataReceived.data 
     rxDataStruct.dataPacket(rxDataStruct.InPacketLength) = byteReceived 
     rxDataStruct.InPacketLength += 1 
    Next 
    rxDataReady = True 

MainParsingRoutine.vb

sendCommand = False 
CANPort.rxDataReady = False 
    Try 
      Do 
       Tries += 1 
       If Tries > 4 Then 
        Exit Do 
       End If 
       CANTimer.Start() 
       CANPort.transmitPacket(OutCANPacket) 

       'Wait for Return Packet 
       Do Until CANPort.rxDataReady = True Or _ 
         CANTimer.ElapsedMilliseconds > timeout 
        System.Threading.Thread.Sleep(0) 
       Loop 
       If CANPORT.rxDataReady = True Then 
        sendCommand = True 
      Loop Until sendCommand = True 

回答

0

如果有人開發過這個頁面,我結束了HID設備和絆倒使用ManualResetEvent。

在CANUSB類的下一行是:

resetEvent.Set() 

然後在MainParsingRoutine.vb我改變:

Do Until CANPort.rxDataReady = True Or _ 
        CANTimer.ElapsedMilliseconds > timeout 
       System.Threading.Thread.Sleep(0) 
      Loop 
      If CANPORT.rxDataReady = True Then 
       sendCommand = True 

到:

CANUSB.resetEvent.WaitOne(100) 

該超時100ms後。

與我們的HID設備非常吻合,比我們以前的FTDI USB串口設備要好得多。

+0

我知道現在真的很老,但我正在研究類似的東西,我很好奇:爲什麼選擇AutoResetEvent的ManualResetEvent? –

+0

我使用ManualResetEvent在發送和接收數據之間保持一個簡單的「狀態」。這對我們的情況有效,因爲每個發送的命令都有一個單獨的響應。如果can bus不管輸出數據,它都不是一個有效的選項。 http://stackoverflow.com/questions/153877/what-is-the-difference-between-manualresetevent-and-autoresetevent-in-net – drinck