2009-02-20 3 views
6

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

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

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

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

Как мне с этим справиться? Какие-нибудь хорошие советы или трюки? Рекомендации библиотеки?

ответ

11

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

Вместо того, чтобы хэшировать это для вас на этом сайте, вот ссылка, на которую я висел на протяжении многих лет. How to perform serial port communications in VBA

+0

+1 Для сайта, имеющего рабочий пример. – Oorang

0
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 = "[email protected]@@@@@@@" 
      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 символов. В приведенном выше коде я генерирую эти командные строки каждый раз, когда получаю новую строку. То, как я выбрал, какого персонажа отправить, немного неуклюже: возможно, лучший способ состоит в том, чтобы иметь указатель на символы и количество символов, а когда они равны, установите их равными нулю.

+0

Если COM-порт открывается как Random, кажется, что EOF сообщает вам, когда у вас есть символ для приема. Это означает, что можно получить нулевой символ. EOF говорит, что персонажей ждать не приходится. –

+0

Установка скорости передачи в OPEN не работает. Но Shell «mode.com com7: 9600, n, 8,1» работает, если вы подождите секунду, прежде чем делать OPEN «COM7:» Это все Excel 2010. –

+0

Обновление EOF с COM-портом как Random: он выглядит как EOF не изменяется с принятым символом, но отражает состояние GET. Итак, после GET # 1 ,, vByte, EOF будет FALSE, когда vByte действителен. –

Смежные вопросы