我正在 VB.NET 中開發一個應用程式(對于使用 FTDI USB 串行芯片的硬體客戶。通信使用 FTD2XX 庫和相應的 Nuget 包(FTD2XX.Net v1.2.1)。在 Visual Studio 的一些更新之后(可能更新到 17.1 ,但我不確定)除少數功能外的所有功能都停止作業。當前的 VS 版本是 17.1.1。例如,可以獲得 FTDI 驅動程式附加的設備數量:
Friend Declare Function FT_CreateDeviceInfoList Lib "FTD2XX.DLL" (ByRef lngNumDevs As Integer) As Integer
...
Dim ftStatus As Integer
Dim numDevices As Integer
ftStatus = FT_CreateDeviceInfoList(numDevices)
在上面的代碼片段中,ftStatus 結果 = 0(即 OK)并numDevices設定為 1(正確)。
當我想做一些嚴肅的事情時,問題就開始了:
Friend Declare Function FT_GetComPortNumber Lib "FTD2XX.DLL" (ByVal lnghandle As Integer, ByRef lplComPortNumber As Integer) As Integer
Friend Declare Function FT_Open Lib "FTD2XX.DLL" (ByVal iDevice As Integer, ByRef lnghandle As Integer) As Integer
Friend Declare Function FT_Close Lib "FTD2XX.DLL" (ByVal lnghandle As Integer) As Integer
Dim portHandle as Integer
Dim cpNumber as Long
For i% = 0 To 255
ftStatus = FT_Open(i, portHandle)
If ftStatus = FT_OK Then
ftStatus = FT_GetComPortNumber(portHandle, cpNumber)
ftStatus = FT_Close(portHandle)
' here is some non-essential code registering that port at index i% exists...
End If
Next
在上面的代碼中,FT_Open 回傳ftStatus = 0(FT_OK) 并為portHandle.
但是,下一個呼叫FT_GetComPortNumber回傳ftStatus = 1(FT_INVALID_HANDLE) 并且傳遞給的值cpNumber是 0xFFFF(顯示為正數,但實際上應該是 -1,我猜......)。更糟糕的是,FT_Close()還會回傳FT_INVALID_HANDLE并且埠仍然開放。我通過嘗試從另一個應用程式打開埠來驗證它 - 訪問被拒絕。
有時,盡管如此混亂,但功能似乎仍然有效,但在我最后一次嘗試中,我根本無法與硬體進行任何FT_Write通信。FT_Read
我嘗試使用System.IO.Ports.SerialPort盡可能多的解決方法,但這根本不起作用。最重要的是,我需要在 RTS 上使用 bit-bang,因為它控制連接到 FTDI 芯片另一側的硬體的電源電壓和復位。沒有可能將 RTS 降低數百毫秒然后一直保持它,我無法控制硬體。AFAIKSystem.IO.Ports.SerialPort不提供這樣做的可能性。
有什么解決辦法?
uj5u.com熱心網友回復:
經過多次試驗和錯誤,它似乎是編譯配置的問題。打開解決方案屬性視窗并單擊編譯選項卡。

然后點擊“高級編譯選項”

如果未選中“洗掉整數溢位檢查”復選框,請檢查它!
我不知道整數溢位檢查如何混淆一個不涉及任何算術運算的 32 位數字,但這就是真正發生的事情。我認為這是 Visual Studio 17.1.6(以及許多以前的版本)中使用的 Visual Basic 編譯器中的一個錯誤,但我沒有深入探討這個主題。
uj5u.com熱心網友回復:
@HansPassant 寫道:
宣告是錯誤的,它必須是lnghandle As IntPtr。在 64 位模式下運行應用程式時的區別Integer和重要性。IntPtr以 .NETCore 為目標時很容易發生這種情況,就像在 VS2022 中一樣。
——漢斯·帕桑特
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473616.html
上一篇:如何將外部CLI視窗嵌入到Windows表單中的面板中?
下一篇:VB.Net公共屬性回傳空值
