首页 > 解决方案 > 使用带有 Visual Basic 6 的 FTDI D2XX 驱动程序读取和写入串行端口

问题描述

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

标签: vb6serial-portftdi

解决方案


我对 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 似乎是你的线索。


推荐阅读