Frage

Was ist der beste Weg, um von VBA auf einen seriellen Port zugreifen zu können?

Ich muss einige unserer Vertriebsmitarbeiter in der Lage sein, eine einfache Zeichenfolge über den seriellen Port von einer Aktionstaste in PowerPoint zu senden. Ich benutze VBA häufig nicht, besonders für so etwas. Normalerweise würde ich daraus eine Art Anwendung verwandeln, aber ich denke eigentlich nicht, dass die Idee so schlimm ist. Es wird ein praktisches Werkzeug für sie sein, dieses Gerät auf einem Projektor zu demonstrieren und mit anderen Vertriebsmitarbeitern und nicht technischen Leuten zu sprechen. Außerdem wird dieser Vertriebsmitarbeiter kein Problem damit haben, kleine Änderungen an der VBA- oder PowerPoint -Präsentation vorzunehmen, würde jedoch nicht so gut bei der Neukompilierung einer .NET -Anwendung abschneiden.

Ich weiß, dass wir es durch eine Stapeldatei aus der Präsentation der Aktion machen könnten, aber das macht mich nicht sehr glücklich. Ich denke, wir könnten wahrscheinlich auf ein COM -Objekt zugreifen und von dort aus rennen, aber ich bin wiederum nicht wirklich in den neuesten und größten Bibliotheken in VBA, und es wäre auch schön, eine kurze kleine Grundierung zu erhalten, wie man sich leicht öffnet. Senden und schließen Sie die Verbindung.

Da dies auf den Computern mehrerer Leute betrieben werden muss, wäre es schön, wenn es leicht zu anderen Maschinen transportieren würde. Ich sollte sagen können, dass es auf Office 2007 und Windows XP laufen muss. Kompatibilität mit allem anderen wäre ein netter Bonus.

Wie soll ich damit umgehen? Irgendwelche guten Tipps oder Tricks? Bibliotheksempfehlungen?

War es hilfreich?

Lösung

Die Win32 -API behandelt den seriellen Port als Datei. Sie können auf die seriellen Ports direkt zugreifen, indem Sie diese API -Funktionen innerhalb von 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 auszuhalten, hier ist eine Referenz, an die ich im Laufe der Jahre aufgehängt bin. So führen Sie serielle Portkommunikation in VBA durch

Andere Tipps

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

Das funktioniert für mich. Ich bin mir nicht sicher, ob die Open tatsächlich die Baud -Rate festlegen, da ich Teraterm zum ersten Mal verwendet habe. Mein COM -Port ist eine USB -Verbindung zu einem Basys3 -Prototyping -Kit. Es spuckt Charaktere bei 9600, Aufzeichnungen von 36 Zeichen, die mit CR enden. Ich kann zufällig Befehle von 9 Zeichen senden. Im obigen Code generiere ich diese Befehlszeichenfolgen jedes Mal, wenn ich eine neue Zeile erhalten habe. Die Art und Weise, wie ich ausgewählt habe, welcher Charakter zu senden soll, ist ein wenig klobig: Vielleicht ist es ein besserer Weg, einen Charakterzeiger und eine Reihe von Zeichen zu haben, und wenn diese gleich sind, um beide auf Null zu setzen.

Hier ist ein kurzes Modul von VBA -Code, mit dem Nachrichten an einem seriellen PC -Port gesendet und empfangen werden können. Dies ist nicht sehr elegant, aber einfach und sollte an modernen Versionen von Excel und Windows arbeiten.

Sie bleiben alleine, um die Funktionalität zu erweitern und die Nachrichten zu speichern oder zu analysieren. Dies zeigt nur das Tiefstand mit niedrigem Niveau, um mit dem seriellen Port umzugehen.

Die ersten 5 Zeilen deklarieren die Millisekunden -Sleep -Bibliotheksfunktion (basierend auf der Excel -Version).

Der Serialport () -Subroutine beschreibt die Schritte zum Öffnen des Ports, über die Übertragung einiger Daten, empfangen einige Daten, empfangen Sie erneut einige Daten (um anzuzeigen, dass er wirklich nicht dem Fehler "Ende der Datei" aussieht) und schließt die Hafen.


#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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top