2009-02-20 6 views
6

Was ist der beste Weg, um von VBA auf eine serielle Schnittstelle zuzugreifen?Was ist der beste Weg, um von VBA auf eine serielle Schnittstelle zuzugreifen?

Ich möchte, dass einige unserer Vertriebsmitarbeiter über eine Aktionsschaltfläche in PowerPoint eine einfache Zeichenfolge über den seriellen Anschluss senden können. Normalerweise verwende ich VBA nicht, vor allem für so etwas. Normalerweise würde ich es in eine Anwendung verwandeln, aber ich glaube nicht, dass die Idee so schlecht ist. Es wird ein praktisches Werkzeug sein, um dieses Gerät mit einem Projektor zu demonstrieren und mit anderen Verkäufern und Nicht-Technikern zu sprechen. Außerdem wird dieser Verkäufer keine Probleme haben, kleine Änderungen an der VBA- oder PowerPoint-Präsentation vorzunehmen, aber es würde nicht so gut sein, eine .NET-Anwendung neu zu kompilieren.

Ich weiß, wir könnten es durch eine Batch-Datei von der Präsentation auf der Aktion ausführen, aber das macht mich nicht sehr glücklich. Ich denke, wir könnten wahrscheinlich auf ein COM-Objekt zugreifen und von dort aus laufen, aber ich bin auch nicht wirklich auf die neuesten und besten Bibliotheken in VBA angewiesen, und es wäre auch schön, einen kurzen kleinen Grund zu bekommen, wie man leicht öffnet, Senden und schließen Sie die Verbindung.

Da dies auf Computern von mehreren Personen ausgeführt werden muss, wäre es gut, wenn es leicht zu anderen Computern transportiert werden könnte. Ich sollte sagen können, dass es auf Office 2007 und Windows XP ausgeführt werden muss. Kompatibilität mit allem anderen wäre ein netter Bonus.

Wie soll ich damit umgehen? Irgendwelche guten Tipps oder Tricks? Bibliothek Empfehlungen?

Antwort

11

Die Win32-API verarbeitet den seriellen Port als Datei. Sie können direkt auf die seriellen Ports zugreifen, indem Sie diese API-Funktionen in VBA aufrufen. Ich musste dies für eine alte .NET-Anwendung tun, aber VBA ist nicht anders.

Anstatt es auf dieser Seite für Sie auszuhacken, hier ist eine Referenz, die ich über die Jahre aufgehängt habe. How to perform serial port communications in VBA

+0

+1 Für Website mit einem Arbeitsbeispiel. – 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 

Das funktioniert für mich. Ich bin mir nicht sicher, ob das OPEN tatsächlich die Baudrate einrichtet, als ich zuerst TeraTerm verwendete. Mein COM-Port ist eine USB-Verbindung zu einem BASYS3-Prototyping-Kit. Es spuckt Zeichen bei 9600, Aufzeichnungen von 36 Zeichen, die mit CR enden. Ich kann Befehle von 9 Zeichen nach dem Zufallsprinzip senden. Im obigen Code erzeuge ich diese Befehlszeichenfolgen jedes Mal, wenn ich eine neue Zeile erhalten habe. Die Art, wie ich das zu sendende Zeichen auswählte, ist ein wenig klobig: Vielleicht ist ein besserer Weg, einen Zeichenzeiger und eine Anzahl von Zeichen zu haben, und wenn diese gleich sind, setzen sie beide auf Null.

+0

Wenn der COM-Port als Random geöffnet wird, zeigt EOF Ihnen an, wenn Sie ein Zeichen haben, das empfangen werden soll. Das bedeutet, dass man ein Null-Zeichen erhalten kann. EOF sagt, dass keine Charaktere warten. –

+0

Das Einstellen der Baudrate im OPEN scheint nicht zu funktionieren. Aber Shell "mode.com com7: 9600, n, 8,1" funktioniert, wenn Sie eine Sekunde warten, bevor Sie die OPEN "COM7:" Dies ist alles Excel 2010. –

+0

Update auf EOF mit COM-Port als zufällig: Es sieht Wie EOF ändert sich nicht mit dem empfangenen Zeichen, sondern spiegelt den Status des GET wider. Nach GET # 1 ,, vByte wird EOF also FALSE sein, wenn vByte gültig ist. –