Чтение и запись в последовательный порт с использованием драйверов FTDI D2XX с Visual Basic 6 - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь установить соединение и считывать данные из виртуального COM-порта, используя VB6, исходя из моего запроса здесь: Ограничения скорости передачи в программном обеспечении и последовательной связи с внешним устройством . Я использую драйвер FTDI для связи с устройством через USB VCP.

Я использую библиотеку FTD2XX в Visual Basic 6 для отображения имени и серийного номера устройства (это уже работает), установки количества стоп-битов, установки скорости передачи данных и количества битов данных. Я хотел бы сейчас читать и писать с последовательного порта, и у меня есть код и вопросы. Мой код ниже:

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 ]

1 голос
/ 17 мая 2019

Кстати, откуда взялись функции, представленные в вопросе FT_Write_String и FT_Write_Bytes ?

В примерах кода FTDI это FT_Write , FT_WriteByte , FT_W32_WriteFile .

Примеры Visual Basic

Модуль D2XX

во многих примерах Visual Basic, размещенных на этой странице, используется модуль для взаимодействия с DLL-библиотекой D2XX. Чтобы загрузить устройство (D2XX_Module.bas) для Visual Basic 6, нажмите здесь .
Обратите внимание, что приведенные ниже примеры кода могут уже содержать модуль, обрабатывающий интерфейс 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 в FT_W32_WriteFile представляется ошибкой ByRef lpszBuffer As Any.

Пример 6

Мы благодарим Боба Фрита (Bob Freeth) за предоставленный пример VB6 по использованию FT2232C MPSSE для связи SPI с АЦП MAX187.
Исходный код и исполняемый файл доступны бесплатно скачать . Этот код предоставляется «как есть» только для иллюстрации, и поэтому ни 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)
1 голос
/ 16 мая 2019

Я не очень знаком с VB, но я часто использую устройства FT через C и python. Итак, вот что я знаю:

Общий комментарий, чтобы избежать неправильных представлений: VCP обозначает Виртуальный COM-порт. Таким образом, это фактически позволяет системе обращаться к устройствам FT без необходимости использования определенной библиотеки, такой как D2XX. Большинство языков предоставляют некоторый «родной» доступ к com-портам. Таким образом, нет никакой необходимости иметь дело с D2XX для обычной работы COM-порта. Он в основном предназначен для альтернативных режимов работы и доступа к MPSSE, насколько мне известно.

1) Если вы откроете порт через D2XX, он будет недоступен для другого доступа. Если вы отпустите его и откроете его другим способом (например, MSComm или IO.Ports.SerialPort в случае auf .net), настройки будут перезаписаны (или, по крайней мере, должны быть автоматически).

2) Я боюсь, что только лучшие проекты от FT - ваш лучший выбор. Но, может быть, кто-то другой может указать на лучший подход.

3) обычно нативный доступ (C и Python) позволяет вам писать и читать простые байтовые строки. Таким образом, единственное, что вам нужно сделать, это «преобразовать» его в правильный тип. ctype / CByte / CInt кажется вашей репликой.

...