2011-09-01 62 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