【问题标题】:Reading and writing to serial port using FTDI D2XX drivers with Visual Basic 6使用带有 Visual Basic 6 的 FTDI D2XX 驱动程序读取和写入串行端口
【发布时间】:2019-10-03 17:20:43
【问题描述】:

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

【问题讨论】:

  • 什么是“FTDI 库之外的函数”?我认为包括读/写功能。
  • @kunif 自从在这里发布以来我一直在尝试 FT_Write_Bytes 和 FT_Write_Strings 函数,但到目前为止我还没有成功。该设备需要向其发送两次二进制数字才能工作。目前我已通过代码修改如下以将数据作为字符串发送: Dim TempStringData As String = 121 然后我使用此命令两次将字符串写入设备:'将字符串数据写入设备 FT_Status = FT_Write_String(FT_Handle , TempStringData, Len(TempStringData), BytesWritten) If FT_Status FT_OK Then Exit Sub End If
  • @kunif 为了将字节写入设备而不是字符串,我在脚本顶部声明变量,如 DimBytestoDevice 为 Byte = 121,然后使用此命令两次发送命令:'写入字符串数据到设备 FT_Status = FT_Write_String(FT_Handle, DimBytestoDevice, Len(DimBytestoDevice ), BytesWritten) If FT_Status FT_OK Then Exit Sub End两个命令。

标签: vb6 serial-port ftdi


【解决方案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

注意:但是FT_W32_WriteFile的ByVal lpszBuffer As String参数好像是ByRef lpszBuffer As Any的错误。

示例 6

感谢 Bob Freeth 提供了这个使用 FT2232C MPSSE 与 MAX187 ADC 进行 SPI 通信的 VB6 示例。
源代码和可执行文件可免费获得download。此代码“按原样”提供仅用于说明目的,因此 FTDI 或 Bob Freeth 均未为此 VB6 代码提供技术支持。


Visual Basic 的字符串变量是 Unicode,因此它们不适合处理二进制数据。

与其替换字符串变量,不如将数据显式存储在字节数组变量中并使用 FT_WriteByte 函数写入。

基于以上内容,将如下。

Dim SendData(nnn) As Byte ' nnn is value of send data size - 1  
SendData(0) = 121
SendData(1) = xxx
SendData(2) = yyy
.
.
.

FT_Status = FT_WriteByte(FT_Handle, SendData(0), Len(SendData), BytesWritten)

【讨论】:

  • 谢谢!当我将 Dim SendData(nnn) 作为 Byte 输入时,它说 nnn 未声明,是否可以放入 3 而不是指定数据大小为 3? xxx 和 yyy 的目的是什么?此外,当我像您那样指定 SendData 时,它会显示“类型的值”一维字节数组无法转换为字节“。这可以通过在 SendData(0) = 121 时放置 SendData(0) 来解决 - 对吗?它们来自 FT_NET 示例,但它们看起来很有效。
  • @velvetshelter, nnn, xxx, yyy,是表示数值的临时字符串。请替换为您实际使用的长度和值。并且值的设置可以使用CByte(121)、CByte(xxx)。
  • 感谢您的所有帮助。我现在可以成功地与我的外部设备通信了。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。需要注意的是,我必须使用 FT_SetBaud 函数将虚拟 COM 端口的波特率设置为 1000000,因为 MSComm 不支持此速率。
  • 你也不能使用VB.net,对吧?您可以尝试使用纯 FT 并将 FT_Read 与 FT_GetStatus 结合使用(有关详细信息,请参阅FT_Read)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多