2011-09-06 45 views
2

我正在使用Visual Basic .NET來使用USB HID設備。檢查空字節

大多數情況下,我可以完美地接收數據...但每千次傳輸中就有一次,我的代碼會認爲它實際上沒有收到數據。

設備寫入一個字節數組。我想檢查是否接收到數據包是空的,做這樣的事情:

If myDevice.dataPacket(1) <> Nothing then 
    myDevice.rxDataReady = False 

不幸的是,即使有這樣的,我得到一個NullReferenceException,說對象引用未設置爲一個對象的實例。

是否有不同的方式來做到這一點,或者我應該只是處理一個NullReferenceException?如果我每分鐘執行這個例程幾百次,會不會加入異常緩慢的東西?

回答

6

因此,一些事情。

  1. Byte爲值類型,因此永遠不能null。在VB.Net中,當您使用等號=設置或檢查Nothing時,您實際上正在設置或檢查該值是否保持「默認值」。對於數值類型的「默認值」是零,因此這兩個語句是一樣的:

    If MyByte = Nothing Then ...

    If MyByte = 0 Then ....

  2. 因爲上面的規則,你應該永遠不會收到一個NullReferenceException(NRE)訪問時,因爲一個字節不能爲空。但是,持有一個字節可以爲空。所以你的情況,你應該檢查:

    If myDevice.dataPacket IsNot Nothing Then

  3. 根據如何內dataPacket的字節設置,你可能還需要檢查dataPacket.Length屬性(檢查dataPacket不爲空後),以確保數組中有足夠的索引。如果你走出指數,你會得到一個IndexOutOfRangeException

    If (myDevice.dataPacket IsNot Nothing) AndAlso (myDevice.dataPacket.Length >= 100) Then

0

嘗試改變語法如下:

If NOT myDevice.dataPacket(1) is Nothing then 
    myDevice.rxDataReady = False 
0

你初始化它(新的)?

myDevice.dataPacket = new List(Of Byte)()