Auf COM-Port -Signale reagieren

Ich möchte ich Programm schreiben, das eine serielle Schnittschtelle abhört und darauf reagiert (unterschiedliche Signale):

1.) Wie realisiere ich solch ein Programm unter VB?
(„COM-Port“-Programmierung)?

2.) Wie kann ich eigentlich eine serielle Schnittstelle simulieren, um mein Programm zu testen?

Hallo Fabian,

von VBA heraus (egal, ob VB, Access, …) kann man eigentlich ganz einfach die serielle Schnittstelle steuern über die - je nach VB-Version - MSComm- oder VComm-Objekte! (Die werden in der Werkzeugleiste standardmäßig NICHT angezeigt, zuerst über Menu Extras-Verweise registrieren!)

Dieses Objekt hat dann ein Event, das auf einkommende Signale reagiert. Alternativ kann man in einem Timer regelmäßig den Eingang von Nachrichten prüfen (und alle dann angefallenen Nachrichten auf einen Schlag abarbeiten)!

zu 2.):

Ich habe mir damals einen Reciever programmiert, der alle einkommenden Signale anzeigt und auch Signale senden kann. Mit 'nem Nullmodemkabel und einem zweiten Rechner geht das dann ganz einfach! (Ist auch 'ne gute Übung, um Erfahrung mit der seriellen Schnittstelle zu sammeln!)

Kurt
http://www.fortwaengler.de

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

zu 2.):

Ich habe mir damals einen Reciever programmiert, der alle
einkommenden Signale anzeigt und auch Signale senden kann. Mit
'nem Nullmodemkabel und einem zweiten Rechner geht das dann
ganz einfach! (Ist auch 'ne gute Übung, um Erfahrung mit der
seriellen Schnittstelle zu sammeln!)

Hallo Kurt,
Deine Antwort wird sicher sehr hilfreich sein. Vielen Dank.
Ich werde mit VB6 versuchen, das Programm zu schreiben.
Könnte ich Dich um ein Gefallen bitten?
Wenn das nicht geht, ist nicht schlimm, aber könnte ich eventl. über Deinen Code /Teilcode verfügen (Reciever-Programm)??
Das würde nämlich sicher sehr hilfreich sein.
Vielen Dank anyway…
Fabian

Hallo Kurt,
Deine Antwort wird sicher sehr hilfreich sein. Vielen Dank.
Ich werde mit VB6 versuchen, das Programm zu schreiben.
Könnte ich Dich um ein Gefallen bitten?
Wenn das nicht geht, ist nicht schlimm, aber könnte ich
eventl. über Deinen Code /Teilcode verfügen
(Reciever-Programm)??
Das würde nämlich sicher sehr hilfreich sein.
Vielen Dank anyway…
Fabian

Hallo Fabian,

leider ist der Code noch für eine (sehr) alte VB-Version geschrieben (Windows 3.1) - ich fürchte, der tut’s heute nicht mehr!
Das Problem ist aber eher das Protokoll, mit dem sich zwei Partner unterhalten (quasi die Sprache) und die Tatsache, dass die Daten immer stossweise kommen (also nicht Befehl für Befehl oder Wort für Wort) - man muss also immer wieder spezielle Sonderzeichen zur Synchronisation senden!

Kurt
http://www.Fortwaengler.de

Hallo Kurt,
jede Info, die ich von Dir bekomme, bringt mich sicher weiter.
Schade mit dem Code.
Ich habe aber 0 Literatur gefunden, wo das Thema abgedeckt ist.
Hast Du einen Vorschlag?? Egal wie Buch oder Online…
Ich brauche einen Anhalt/Anfangspunkt.
Danke vielmals

Hallo Fabian,
hier Uwe, habe auch versucht, auf die serielle Schnittstelle am PC unter VB zuzugreifen und nichts gefunden, was so auf Anhieb geht ( trotz e-hilfe von netten Leuten ) ist eigentlich verwuderlich, daß immer wieder ähnliche Fragen im www auftauchen. Habe mich an Kurts Antwort gehalten und auch was gefunden. Bei mir ists im Menu Projects / Components, da kommt eine lange Liste : Microsoft Comm Control 6.0 anklicken, dann erscheint auf der ToolLeiste ein gelbes Telefon, mit Modem untendrunter, „kann was mit seriell zu tun haben…“ dachte ich. Das doppelklicken, dann kommts auch aufs Object (Shift F7 ). Dort doppelklicken, dann erscheinen die Stellen in den Funktionen, wo Du Deinen Code reinschreiben kannst. Gut kommt zum Beispiel :
MSComm1.CommPort = 1
MSComm1.Settings = „9600,N,8,1“
MSComm1.InputLen = 0
MSComm1.PortOpen = True
MSComm1.Output = „:“
MSComm1.Output = „a“
MSComm1.Output = Chr$(13)
MSComm1.PortOpen = False
Bei mir resettet das das angeschlossene Gerät an der COM1. COMt gut, sozusagen. Hoffe, Du hast ähnlich positive Erlebnisse in der nächsten Zeit. Wenn nicht, melde Dich, können wir noch ein wenig fachsimpeln bzw. gemeinsam Vermutungen anstellen, wie das alles so funktioniert. Wie Du siehst bin ich kein Experte, aber vielleicht sind wir ja schon bald zwei halbe…
Gruss Uwe
PS: Vielen Dank an Kurt, die Hinweise waren nicht schlecht !

Hallo Fabian,

den Code kann ich wirklich nicht 'rausrücken - erstens ist er von 1993, zweitens sehr speziell und drittens enthält er Code, den nicht ich geschrieben habe!

Wenn Du aber tatsächlich nur einen „Spion“ haben willst, der die einkommenden Signale anzeigt, hier ein paar Hilfen:

Uwe hat richtig gelegen die aktuelle von Microsoft gelieferte Version ist das „Microsoft Comm Control 6.0“.
Per eMail bekommst Du einen Text von MS zum Thema COM-Schnittstelle und ein kleines Code-Beispiel. Die möglichen Konstanten sind auch gut beschrieben im Objektkatalog (Control aktivieren, F2 drücken - geht auch bei allen anderen Controls!).

Zum Empfangen braucht’s nicht allzu viel, kompliziert ist vor allem der Dialog - wenn z.B. ein Wort nicht vollständig übertragen wurde, muss mit der Auswertung gewartet werden, bis der Rest angekommen ist! Weil eine serielle Leitung auch ziemlich störanfällig ist, sollten auch Bestätigungen versendet werden…

Aber das alles betrifft Dich ja anscheinend nicht…

Bei Dir gibt’s eigentlich nur zwei Hürden: (In meinen Beispielen heist das Control „Communicate“)

  1. Das (richtige) Ansprechen der Schnittstelle
    Wenn nicht beide Partner die gleiche „Sprache“ sprechen, geht gar nichts.
    Hier ist vor allem die Property „Settings“ wichtig. Sie enthält die Geschwindigkeit, Parity (Y/N), Daten- und Stopbits.
    Communicate.Settings = „9600,N,8,1“
    würde also die Übertragungsrate auf 9600 Baud setzen, keine Parity, 8 Daten- und 1 Stopbit definieren.
    Gültige Werte für die Geschwindigkeit: 110, 300, 600, 1200, 2400, 4800, 9600 (Default), 14400, 19200, 28800, 38400, 56000, 57600, 15200, 128000, 256000

Dann gibt’s da noch das „Handshaking“ - der Empfänger muss manche Vorgänge bestätigen.
comNone - Default
comXOnXOff
comRTS (RTS/CTS, Request To Send/Clear To Send)
comRTSXOnXOff (Both Request To Send and XON/XOFF handshaking)

Das allerwichtigste ist aber natürlich der COM-Port! (Wer hat sich noch nie 'nen Rechner zerlegt durch 'nen falschen COM-Port für’s Modem?) Einzustellen über Property „CommPort“…
PortOpen aktiviert schließlich den COM-Port mit den neuen Einstellungen (vor allen Veränderungen nicht vergessen, wieder abzuschalten!)

Mit folgendem Code kann untersucht werden, ob und welche COM-Ports verfügbar sind!

cnt=0
Do
cnt = cnt + 1
Communicate.CommPort = cnt
'Test: Can Port be opened?
On Error Resume Next
Communicate.PortOpen = True
openErr = Err
On Error GoTo 0
If openErr = 0 Then
'Close opened port
Communicate.PortOpen = False
'This port is available!

ElseIf openErr 68 Then
'Port should be available, but there’s another error!

Else
'No chance…
Endif
Loop until cnt>=16 '„Willkürliche“ Obergrenze

  1. Der Empfang der Daten
    Das Ereignis OnComm wird immer dann ausgelöst, wenn irgendetwas mit der seriellen Schnittstelle passiert!
    Da kann man also auch z.B. Daten auslesen - nur wird die entsprechende Routine dann sehr oft aufgerufen!

Private Sub Communicate_OnComm()
'Which type of action?
'If message was received: Write to screen!
'Message boxes in other cases are inserted to find out
'which errors and events occur in practice!
'Later some code can be inserted instead of the message boxes!
Dim tempText As String
Select Case Communicate.CommEvent
’ Errors
Case comEventBreak ’ A Break was received.
Case comEventFrame ’ Framing Error
Case comEventOverrun ’ Data Lost.
Case comEventRxOver ’ Receive buffer overflow.
Case comEventRxParity ’ Parity Error.
Case comEventTxFull ’ Transmit buffer full.
Case comEventDCB ’ Unexpected error retrieving DCB
’ Events
Case comEvCD ’ Change in the CD line.
'This event will not occur without a modem!
Case comEvCTS ’ Change in the CTS line.
'This event will not occur with only 3 wires!
Case comEvDSR ’ Change in the DSR line.
'This event will not occur with only 3 wires!
'VB-help says: „Change to TRUE will NOT be detected“!
'But this is not the truth, it WILL be detected!!!
'Event comEVDSR will be occur if the connection is
'installed (DSRHolding=TRUE) or interrupted (DSRHolding=FALSE)!
Case comEvRing ’ Change in the Ring Indicator.
Case comEvReceive ’ Received RThreshold # of chars.
’Hier können die empfangenen Daten ausgewertet werden!
Debug.Print Communicate.Input
Case comEvSend ’ There are SThreshold number of
’ characters in the transmit buffer.
'Nothing to do, all will be done by WINDOWS and VB!!
Case comEvEOF ’ An EOF charater was found in the input stream
Case Else
End Select
End Sub

Wenn auf diese Art zu viele Events zustandekommen, könnte man die Verarbeitung der Daten auch in einem Timer erledigen - z.B. jede Sekunde einmal die empfangenen Zeichen auf einen Schlag verarbeiten?

Kurt
http://www.fortwaengler.de

P.S.: Wenn man einen Artikel hilfreich findet, sollte man Bewertungspunkte vergeben - das hilft den Autoren und den Nutzern, die so auf Dauer das Fachwissen der Autoren besser beurteilen können!

1 Like

Hallo Uwe,

Du findest einen Text von mir als Antwort auf Fabians letzte Frage!

Kurt
http://www.fortwaengler.de