2009-02-20 30 views
6

Jaki jest najlepszy sposób uzyskania dostępu do portu szeregowego z VBA?Jaki jest najlepszy sposób uzyskania dostępu do portu szeregowego z VBA?

Potrzebuję niektórych naszych przedstawicieli handlowych, aby móc wysłać prosty ciąg przez port szeregowy z przycisku akcji w programie PowerPoint. Nie używam powszechnie języka VBA, zwłaszcza w takich sytuacjach. Normalnie zmieniłem to w jakąś aplikację, ale nie sądzę, że pomysł jest taki zły. Będzie to dla nich przydatne narzędzie do demonstrowania tego urządzenia podczas pracy z projektorem i rozmowy z innymi sprzedawcami i ludźmi niezwiązanymi z technologią. Ponadto, ten sprzedawca nie będzie miał problemu z wprowadzeniem niewielkich modyfikacji do prezentacji VBA lub PowerPoint, ale nie poradziłby sobie z ponowną kompilacją aplikacji .NET.

Wiem, że możemy to zrobić poprzez plik wsadowy uruchamiany z prezentacji na temat akcji, ale to nie czyni mnie bardzo szczęśliwym. Sądzę, że prawdopodobnie uzyskalibyśmy dostęp do obiektu COM i uruchomilibyśmy stamtąd, ale znowu nie jestem w pełni zaawansowany w najnowszych i najwspanialszych bibliotekach do wykorzystania w VBA, a także byłoby miło uzyskać szybki mały podkład w jak łatwo otworzyć, wyślij i zamknij połączenie.

Ponieważ będzie to musiało być uruchomione na komputerach wielu osób, byłoby miło, gdyby był łatwy do transportowania na inne maszyny. Powinienem móc powiedzieć, że musi działać na Office 2007 i Windows XP. Zgodność z czymkolwiek innym byłaby jednak miłym dodatkiem.

Jak mam sobie z tym poradzić? Jakieś dobre rady lub sztuczki? Zalecenia biblioteki?

Odpowiedz

11

Interfejs Win32 API obsługuje port szeregowy jako plik. Dostęp do portów szeregowych można uzyskać bezpośrednio, wywołując te funkcje API z poziomu VBA. Musiałem to zrobić dla starej aplikacji .NET, ale VBA nie jest inaczej.

Zamiast haszysz dla ciebie na tej stronie, tutaj jest odniesienie, na którym przez lata stałem. How to perform serial port communications in VBA

+0

+1 Dla strony mającej przykład roboczy. – 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 

To działa dla mnie. Nie jestem pewien, czy OPEN rzeczywiście ustawia szybkość transmisji, ponieważ pierwszy raz użyłem TeraTerm. Mój port COM to połączenie USB z zestawem do prototypowania BASYS3. To wypluwa znaki przy 9600, zapisy 36 znaków kończące się na CR. Mogę losowo wysyłać komendy składające się z 9 znaków. W powyższym kodzie generuję te ciągi poleceń za każdym razem, gdy otrzymuję nową linię. Sposób, w jaki wybrałem znak do wysłania, jest trochę niezgrabny: być może lepszym sposobem jest posiadanie wskaźnika postaci i liczby znaków, a gdy te będą równe, ustawić je na zero.

+0

Jeśli port COM jest otwarty jako losowy, wydaje się, że EOF mówi ci, kiedy masz postać do odebrania. Oznacza to, że można otrzymać znak Null. EOF mówi, że nie ma postów czekających. –

+0

Ustawienie prędkości transmisji OPEN nie działa. Ale Shell "tryb.com com7: 9600, n, 8,1" działa, jeśli poczekasz sekundę przed zrobieniem OPEN "COM7:" To wszystko jest Excelem. –

+0

Aktualizacja na EOF z portem COM jako losowym: Wygląda podobnie jak EOF nie zmienia się z otrzymanym charakterem, ale odzwierciedla status GET. Więc po GET # 1, vByte, EOF będzie FALSE, gdy vByte jest ważny. –

Powiązane problemy