Каков наилучший способ получить доступ к последовательному порту из VBA? - PullRequest
8 голосов
/ 20 февраля 2009

Каков наилучший способ доступа к последовательному порту из VBA?

Мне нужно, чтобы некоторые наши торговые представители могли отправлять простую строку через последовательный порт с помощью кнопки действий в PowerPoint. Я обычно не использую VBA, особенно для чего-то подобного. Обычно я превращаю это в какое-то приложение, но на самом деле я не думаю, что идея настолько плоха. Для них это будет удобный инструмент для демонстрации этого устройства во время работы на проекторе и общения с другими продавцами и не техническими специалистами. Кроме того, у этого продавца нет проблем с внесением небольших изменений в презентацию VBA или PowerPoint, но он не справится с перекомпиляцией приложения .NET.

Я знаю, что мы могли бы сделать это через пакетный файл, запущенный из презентации о действии, но это не делает меня очень счастливым. Я полагаю, что мы могли бы получить доступ к COM-объекту и запустить его оттуда, но, опять же, я не совсем разбираюсь в последних и лучших библиотеках, которые можно использовать в VBA, и было бы также неплохо получить небольшой краткий учебник о том, как легко открывать, отправьте и закройте соединение.

Поскольку это нужно будет запускать на компьютерах нескольких людей, было бы хорошо, если бы его можно было легко переносить на другие машины. Я должен быть в состоянии сказать, что он должен работать на Office 2007 и Windows XP. Совместимость с чем-либо еще была бы хорошим бонусом.

Как мне поступить с этим? Есть хорошие советы или хитрости? Библиотечные рекомендации?

Ответы [ 3 ]

11 голосов
/ 18 марта 2009

Win32 API обрабатывает последовательный порт как файл. Вы можете получить доступ к последовательным портам напрямую, вызвав эти функции API из VBA. Я должен был сделать это для старого приложения .NET, но VBA ничем не отличается.

Вместо того, чтобы хешировать это для вас на этом сайте, вот ссылка, которую я держал на протяжении многих лет. Как выполнить связь через последовательный порт в VBA

0 голосов
/ 02 ноября 2018

Вот краткий модуль кода VBA, который может отправлять и получать сообщения через последовательный порт ПК. Это не очень элегантно, но просто и должно работать на современных версиях Excel и Windows.

Вы оставлены наедине с собой, чтобы расширить функциональность и сохранить или проанализировать сообщения. Это просто показывает низкоуровневый материал для работы с последовательным портом.

Первые 5 строк объявляют миллисекундную библиотечную функцию «Сон» (на основе версии Excel).

Подпрограмма SerialPort () описывает шаги для открытия порта, передачи некоторых данных, получения некоторых данных, повторной попытки получения некоторых данных (чтобы показать, что он действительно не сталкивается с ошибкой «конец файла») и закройте порт.


#If VBA7 Then ' Excel 2010 or later
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else ' Excel 2007 or earlier
    Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If

Public Sub SerialPort()
    ' open a COM port, transmit a message, gather results, close the port.

    ' open the COM port as file #1
    Debug.Print "Open COM port 4"
    Open "COM4:115200,N,8,1" For Binary Access Read Write As #1

    transmit$ = Chr(2) + "Hello, World." + Chr(13)
    receiveDummy$ = "~~~"

    ' transmit a message
    Put #1, , transmit$
    Debug.Print "Message sent."

    ' wait a bit for a response
    Sleep 100

    ' check for received message
    Debug.Print "Look for incoming message."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' do it again to show that the empty input queue doesn't stop the flow
    Debug.Print "Look again for incoming message (should not stop on error)."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' close the serial port
    Debug.Print "Close COM port."
    Close #1

    Debug.Print "Done."
End Sub
0 голосов
/ 12 января 2017
Sub Stinky()
Dim COM_Byte As Byte
Dim Received_Lines As Long
Dim Input_Buffer As String
Dim Output_Buffer As String
Dim Chars2Send As Long
Dim CharsRemaining As Long
Dim lfsr As Long
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1
    Input_Buffer = ""
    CharsRemaining = 0
    Do
    Get #1, , COM_Byte
    If COM_Byte Then
        If COM_Byte = 13 Then           ' look for CR line termination
            Debug.Print Input_Buffer, Now   ' print it
            Input_Buffer = ""               ' and clear input buffer
        '   generate some output (9 characters)
            lfsr = &H3FFFFFFF - 2 ^ (Received_Lines And 15)
            Output_Buffer = "?@@@@@@@@"
            Chars2Send = 9
            CharsRemaining = 9
            For j = 0 To 2
                Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr / 32 ^ (2 - j))))
            Next j
            Debug.Print Output_Buffer
        '   show what I generated
            Received_Lines = Received_Lines + 1 ' keep track of received line count
        Else
            Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer
        '   process any characters to send
            If CharsRemaining Then
                CharsRemaining = CharsRemaining - 1
                COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1))
                Put #1, , COM_Byte
            End If
        End If
    End If
    DoEvents
    Loop
    Close
End Sub

Это работает для меня. Я не уверен, действительно ли OPEN устанавливает скорость передачи данных, как я впервые использовал TeraTerm. Мой COM-порт представляет собой USB-соединение с комплектом прототипов BASYS3. Это извергает символы на 9600, записи 36 символов, заканчивающиеся CR. Я могу произвольно отправлять команды из 9 символов. В приведенном выше коде я генерирую эти командные строки каждый раз, когда получаю новую строку. Способ, которым я выбрал, какой символ отправлять, немного неуклюжий: возможно, лучший способ состоит в том, чтобы иметь указатель символа и количество символов, и когда они равны, установите их обоих равными нулю.

...