Как лучше всего получить доступ к серийному порту от VBA?
-
05-09-2019 - |
Вопрос
Как лучше всего получить доступ к серийному порту от VBA?
Мне нужно, чтобы некоторые из наших торговых представителей могли отправлять простую строку через последовательный порт с кнопки действий в PowerPoint. Я обычно не использую VBA, особенно для чего -то подобного. Обычно я бы превратил его в какое -то приложение, но на самом деле я не думаю, что идея такая плохая. Для них это будет удобным инструментом для демонстрации этого устройства, находящегося на проекте и разговаривать с другими парнями по продажам и не техническими людьми. Кроме того, у этого продавца не будет проблем с внесением небольших изменений в презентации VBA или PowerPoint, но не будет хорошо перекомпилировать приложение .NET.
Я знаю, что мы могли бы сделать это с помощью пакетного файла, запускающегося из презентации по действию, но это не делает меня очень счастливым. Я полагаю, что мы, вероятно, могли бы получить доступ к объекту COM и запустить оттуда, но опять же, я не настоящий в последних и лучших библиотеках для использования в VBA, и было бы также приятно получить быстрый маленький учебник в том, как легко открыть, Отправить и закрыть соединение.
Поскольку это нужно будет работать на нескольких компьютерах людей, было бы неплохо, если бы это было легко переносить на другие машины. Я должен быть в состоянии сказать, что он должен работать в Office 2007 и Windows XP. Совместимость со всем остальным было бы хорошим бонусом.
Как мне справиться с этим? Есть хорошие советы или хитрости? Рекомендации библиотеки?
Решение
API Win32 обрабатывает последовательный порт в качестве файла. Вы можете получить доступ к последовательным портам непосредственно, вызывая эти функции API из VBA. Я должен был сделать это для старого приложения .NET, но VBA ничем не отличается.
Вместо того, чтобы вытащить это для вас на этом сайте, вот ссылка, на которую я повесил на протяжении многих лет. Как выполнить коммуникации серийного порта в VBA
Другие советы
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
Это работает для меня. Я не уверен, что открытый фактически устанавливает скорость передачи, так как я впервые использовал Teraterm. Мой COM -порт - USB -соединение с набором для прототипирования BASYS3. Это извергает символы в 9600, записи 36 символов, заканчивающихся CR. Я могу случайным образом отправлять команды из 9 символов. В приведенном выше коде я генерирую эти командные строки каждый раз, когда получал новую строку. То, как я выбрал, какой персонаж посылать, немного неуклюже: возможно, лучший способ иметь указатель персонажа и ряд символов, и когда они равны, чтобы установить их обоих на ноль.
Вот краткий модуль кода VBA, который может отправлять и получать сообщения на последовательном порту ПК. Это не очень элегантно, но это просто и должно работать над современными версиями Excel и Windows.
Вы остаетесь самостоятельно, чтобы расширить функциональность и хранить или разобрать сообщения. Это просто показывает материал низкого уровня, чтобы справиться с последовательным портом.
Первые 5 строк объявляют библиотеку Millisecond «Sleep» (на основе версии 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