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“)
- 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
- 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!