使用FTDI D2XX驱动程序和Visual Basic 6对串口进行读写操作

时间:2019-05-16 12:19:36

标签: vb6 serial-port ftdi

我正在尝试使用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与之通信的设备?

2 个答案:

答案 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

Visual Basic Examples

  

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