我正在尝试使用VB6建立连接并从虚拟COM端口读取数据,以下是我在这里的查询:Baud rate limits in software and serial communication with an external device。我正在使用FTDI驱动程序通过USB VCP与设备通信。
我正在Visual Basic 6上使用FTD2XX库来显示设备的名称和序列号(这已经起作用),设置停止位的数量,设置波特率和数据位的数量。我现在想从串行端口进行读写,但是我有一些代码和问题。我的代码如下:
Public Class FTDI1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim DeviceIndex As Integer
Dim TempDevString As String
Dim Read_Result As Integer
Dim Read_Count As Integer
' Get serial number of device with index 0
' Allocate space for string variable
TempDevString = Space(16)
FT_Status = FT_GetDeviceString(DeviceIndex, TempDevString, FT_LIST_BY_INDEX Or FT_OPEN_BY_SERIAL_NUMBER)
If FT_Status <> FT_OK Then
Exit Sub
End If
FT_Serial_Number = Microsoft.VisualBasic.Left(TempDevString, InStr(1, TempDevString, vbNullChar) - 1)
' Display serial number on form
TextBox1.Text = FT_Serial_Number
' Get the model of the connected device
TempDevString = Space(64)
FT_Status = FT_GetDeviceString(DeviceIndex, TempDevString, FT_LIST_BY_INDEX Or FT_OPEN_BY_DESCRIPTION)
If FT_Status <> FT_OK Then
Exit Sub
End If
FT_Description = Microsoft.VisualBasic.Left(TempDevString, InStr(1, TempDevString, vbNullChar) - 1)
' Display serial number on form
TextBox2.Text = FT_Description
' Set baud rate of the connected device
' Set Baud Rate
FT_Status = FT_SetBaudRate(FT_Handle, 1000000)
If FT_Status <> FT_OK Then
Debug.Print("Baud rate set")
Exit Sub
End If
' Set the number of stop bits of the recorded device
' Set parameters
FT_Status = FT_SetDataCharacteristics(FT_Handle, FT_DATA_BITS_8, FT_STOP_BITS_2, FT_PARITY_NONE)
If FT_Status <> FT_OK Then
Debug.Print("Stop bits, parity and data bits set")
Exit Sub
End If
' Read bytes (not strings)
FT_Status = FT_Read_Bytes(FT_Handle, FT_In_Buffer(16), Read_Count, Read_Result)
If FT_Status <> FT_OK Then
Debug.Print(Read_Result)
Exit Sub
End If
' Display read bytes on form
TextBox3.Text = Read_Result
' Close device
FT_Status = FT_Close(FT_Handle)
If FT_Status <> FT_OK Then
Exit Sub
End If
End Sub
End Class
我的问题如下:
1)我已经使用FD2XX库设置了波特率,停止位和数据位数。完成此操作后,是否可以直接使用FTDI库中未包含的功能直接连接至串行端口并发送或接收数据?我之所以这样问,是因为我不确定FTD2XX驱动程序是否与VCP分开,而FTDI没有提供有关使用USB VCP进行串行通信的文档。
2)是否有完善的函数库/代码建议可让我阅读?如果这需要某种形式的转换,也可以建议为此提供完善的函数库吗?
3)是否有完善的函数库,用于将无符号整数写入要通过USB VCP与之通信的设备?
答案 0 :(得分:1)
我对VB并不是很熟悉,但是我经常通过C和python使用FT设备。所以这就是我所知道的:
为避免误解的一般注释:VCP代表虚拟COM端口。因此,这实际上使系统能够寻址FT设备,而无需使用D2XX之类的特定库。大多数语言都提供对COM端口的“本地”访问。因此,对于常规的COM操作,完全不需要处理D2XX。据我所知,它主要是用于替代操作模式和访问MPSSE。
1)如果通过D2XX打开端口,则该端口将不可用于其他访问。如果您释放它并通过其他方式打开它(例如,如果是auf .net,则是MSComm或IO.Ports.SerialPort),则设置将被覆盖(或至少应该是自动的)。
2)恐怕只有FT的示例项目才是最好的选择。但是也许其他人可以指出一种更好的方法。
3)通常,本机访问(使用C和python)允许您写入和读取纯字节字符串。因此,您唯一要做的就是将其“转换”为正确的类型。 ctype / CByte / CInt似乎是您的提示。
答案 1 :(得分:1)
问题中出现的 FT_Write_String 和 FT_Write_Bytes 函数从何而来?
在FTDI代码示例中,它是 FT_Write , FT_WriteByte , FT_W32_WriteFile 。
D2XX模块
此页面上发布的许多Visual Basic示例都使用一个模块来连接D2XX DLL。要下载Visual Basic 6的单元(D2XX_Module.bas),click here。
请注意,下面的代码示例可能已经包含处理D2XX DLL接口的模块。当前模块文件与示例中分发的模块文件之间可能存在差异。D2XX_Module.bas
Public Declare Function FT_Write Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesWritten As Long) As Long Public Declare Function FT_WriteByte Lib "FTD2XX.DLL" Alias "FT_Write" (ByVal lngHandle As Long, ByRef lpszBuffer As Any, ByVal lngBufferSize As Long, ByRef lngBytesWritten As Long) As Long Public Declare Function FT_W32_WriteFile Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesWritten As Long, ByRef lpftOverlapped As lpOverlapped) As Long
注意:但是,ByVal lpszBuffer As String
的{{1}}参数似乎是FT_W32_WriteFile
的错误。
示例6
我们要感谢Bob Freeth提供的VB6示例,该示例使用FT2232C MPSSE与MAX187 ADC进行SPI通信。
源代码和可执行文件可免费使用download。该代码按“原样”提供,仅出于说明目的,因此FTDI或Bob Freeth均未提供此VB6代码的技术支持。
Visual Basic的String变量是Unicode,因此它们不适合处理二进制数据。
与其代替String变量,不如将数据显式存储在字节数组变量中并使用FT_WriteByte函数进行写入更好。
基于上述内容,将如下所示。
ByRef lpszBuffer As Any