首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Visual 6使用FTDI D2XX驱动程序读写串口

用Visual 6使用FTDI D2XX驱动程序读写串口
EN

Stack Overflow用户
提问于 2019-05-16 12:19:36
回答 2查看 2.7K关注 0票数 1

我正在尝试使用VB6建立连接并从虚拟COM端口读取数据,下面是我在这里查询的内容:软件和与外部设备的串行通信中的波特率限制。我使用FTDI驱动程序通过USB与设备进行通信。

我正在使用Visual 6上的FTD2XX库来显示设备的名称和序列号(这已经起作用了),设置停止位数,设置波特率和数据位数。我想现在读和写从串口,我有一些代码和问题。我的代码如下:

代码语言:javascript
复制
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进行串行通信的文档。

( 2)是否有任何记录良好的函数库/代码建议,使我能够从中阅读?如果这需要某种形式的转换,那么也可以建议建立一个完整的函数库吗?

3)是否有任何记录良好的函数库,用于将无符号整数写入我通过USB与之通信的设备?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-17 11:40:04

顺便问一下,问题中提出的FT_Write_StringFT_Write_Bytes函数从何而来?

在FTDI代码示例中,它是FT_WriteFT_WriteByte

可视化基本示例

D2XX模块 在此页面上发布的许多Visual示例使用一个模块与D2XX DLL进行接口。要下载Visual 6的单元(D2XX_Module.bas),单击此处 请注意,下面的代码示例可能已经包含一个处理D2XX DLL接口的模块。当前模块文件与随示例分发的模块文件之间可能存在差异。D2XX_Module.bas 公开声明函数FT_Write Lib "FTD2XX.DLL“(ByVal lngHandle As Long,ByVal lpszBuffer As String,ByVal lngBufferSize As Long,ByRef lngBytesWritten As Long)与公共声明函数FT_WriteByte Lib”Alias“FT_Write (ByVal lngHandle As,ByRef lpszBuffer As As "FT_Write”)一样长(ByVal lngHandle As,ByRef lpszBuffer As As As,Long,Lib“”(en24#,en26#,en33 28,en33 28,en33 29#,#en32表示33)

注意:然而,,FT_W32_WriteFileByVal lpszBuffer As String参数似乎是ByRef lpszBuffer As Any的错误。

示例6 我们感谢Bob提供了这个使用VB6 MPSSE与MAX187 ADC通信的MAX187示例。 源代码和可执行文件可用于免费的下载。此代码仅为说明目的而提供“原样”,因此,FTDI或Bob都没有为此VB6代码提供技术支持。

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

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

基于上述情况,将如下所示。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2019-05-16 14:24:57

我不太熟悉VB,但我经常通过C和python使用FT设备。所以我知道的是:

为了避免错误的概念: VCP代表Virtual端口。因此,这实际上使系统能够处理FT设备,而不需要使用像D2XX这样的特定库。大多数语言提供对com端口的一些“本机”访问。因此,对于常规的com端口操作,根本不需要处理D2XX。据我所知,它主要用于替代操作模式和访问MPSSE。

1)如果您通过D2XX打开一个端口,它将不可用于其他访问。如果您释放它并通过另一种方式打开它(例如,MSComm或IO.Ports.SerialPort,以防出现.net),设置将被覆盖(或者至少应该是自动的)。

2)恐怕只有英国“金融时报”的例子项目才是你的最佳选择。但也许其他人可以指出一个更好的方法。

3)通常,本机访问(C和python)允许您编写和读取普通字节字符串。所以你唯一要做的就是把它转换成正确的类型。ctype / CByte / CInt似乎是你的提示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56168399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档