Zurück zur Homepage

Com Port

Leitungen einer Seriellen Schnittstelle können gesetzt und via API abgefragt werden. Verschiedene Steueraufgaben kann man damit erledigen.
DEE ist hier der Computer
Die serielle Schnittstelle am PC ist als RS232 Schnittstelle ausgeführt. Dabei gibt es zwei Ausführungen, einmal 25-Polig und einmal 9-Polig. Die Funktionen sind gleich, nur die Pinbelegung ist anders. Ich beschreibe hier mal die 9-polige.
Pin 1=DCD (Data Carrier Detect). Damit wird dem PC mitgeteilt, daß der Signalpegel in Ordnung ist und die Übertragung beginnen kann.
Pin 2=RXD (Receive Data). Empfangsleitung : Hier kommen die einzelnen Bits nacheinander an.
Pin 3=TXD (Transmit Data). Sendeleitung : Hierüber werden die einzelnen Bits nacheinander gesendet.
Pin 4=DTR (Data Terminal Ready) : Hierüber meldet der Computer (DEE=DatenEndEinrichtung), daß er zur Datenverarbeitung bereit ist. Kann gesetzt werden.
Pin 5=GND (Ground) : Masse.
Pin 6=DSR (Data Set Ready) : Damit wird der DEE angezeigt, daß die Peripherie betriebsbereit ist. Ist somit ein Eingang.
Pin 7=RTS (Request To Send) : Wird von der DEE gesetzt. Siehe CTS.
Pin 8=CTS (Clear To Send) : Als Reaktion auf RTS meldet die Peripherie, wenn sie zur Datenaufnahme bereit ist.
Pin 9=RI (Ring Indikator) : Hierüber meldet zum Beispiel ein Modem einen eingehenden Anruf (Ring).

Für die Datenübertragung ist eigentlich nur TXD, RXD und GND wichtig. Häufig werden RTS-CTS und DTR-DSR gebrückt, wenn die Software die Signale fordert, die Peripherie diese nicht anbieten kann.
Man kann die zwei Handshake-Leitungen DTR und RTS zum Ansteuern einer LED benutzen und zusätzlich TXD. Die Ausgänge bringen bei einer Leerlaufspannung von etwa 10V aber nur 10-20 mA, gerade richtig, um ohne Vorwiderstand eine LED anzuschließen.

Mit einem kleinen Kondensator kann man beispielsweise auch Widerstände messen. Mit etwas Phantasie lässt sich so ziemlich messen und ansteuern. Schaltungen und Programme dazu gibt es massig im I-Net. Einfach mal googeln. Diese Programme setzen aber meist eine kleine dll auf dem System voraus, weshalb der Code dann angepasst werden muss. Setzt man anstatt dieser dlls meine Funktionen ein, hat das den Vorteil, dass der Code auf allen (Win) Systemen ohne Installation, Registrierung und Zusatzdateien läuft.

Beispieldatei (schnittstelle.zip 28 kB)

Private Declare Function CreateFile Lib "kernel32" Alias _
  "CreateFileA" (ByVal lpFileName As String, ByVal _
  dwDesiredAccess As Long, ByVal dwShareMode As Long, _
  lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal _
  dwCreationDisposition As Long, ByVal dwFlagsAndAttributes _
  As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
  hObject As Long) As Long

Private Declare Function SetCommBreak Lib "kernel32" _
  (ByVal nCid As Long) As Long

Private Declare Function ClearCommBreak Lib "kernel32" _
  (ByVal nCid As Long) As Long

Private Declare Function EscapeCommFunction& Lib "kernel32" _
  (ByVal nCid As Long, ByVal nFunc As Long)

Private Declare Function GetLastError Lib "kernel32" () As Long

Private Declare Function GetCommModemStatus& Lib "kernel32" _
  (ByVal hFile As Long, lpModemStat As Long)

Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const SETDTR = 5
Private Const SETRTS = 3
Private Const CLRDTR = 6
Private Const CLRRTS = 4
Private Const MS_DSR_ON = &H20&
Private Const MS_CTS_ON = &H10&
Private Const MS_RING_ON = &H40&
Private Const MS_RLSD_ON = &H80&

 Private Type SECURITY_ATTRIBUTES
  nLength As Long
  lpSecurityDescriptor As Long
  bInheritHandle As Long
End Type

Private ComHandle&

Private Sub test()
  KommunikationÖffnen
  DTR True 'Pin 4
  DTR False 'Aus
  RTS True 'Pin 7
  RTS False 'Aus
  TXD True 'Pin 3
  TXD False 'Aus
  'Ground Pin 5
  KommunikationSchließen
End Sub

Public Sub KommunikationSchließen(Optional CommHandle As Long)
  Dim Fehler&
  If CommHandle <> 0 Then
    CloseHandle CommHandle
  Else
    CloseHandle ComHandle
  End If
  ComHandle = 0
End Sub

Public Function KommunikationÖffnen(Optional Port As String) As Long
  Dim Sicherheit As SECURITY_ATTRIBUTES
  Dim Zugriff&, Fehler&
  On Error GoTo fehlerbehandlung
  Zugriff = GENERIC_READ Or GENERIC_WRITE
  If Port = "" Then Port = "COM1"
  Sicherheit.nLength = 12
  Sicherheit.bInheritHandle = 0
  Sicherheit.lpSecurityDescriptor = 0
  Fehler = GetLastError
  If ComHandle <> 0 Then GoTo fehlerbehandlung
  ComHandle = CreateFile(Port, Zugriff, 0&, Sicherheit, _
    OPEN_EXISTING, 0&, 0&)
  Fehler = GetLastError
  If Fehler <> 0 Then GoTo fehlerbehandlung
  KommunikationÖffnen = ComHandle
  Exit Function
  fehlerbehandlung:
  MsgBox "Fehler beim öffnen von Port : " & Port
  End Function

Public Function DTR(DTRAN As Boolean) As Boolean
  Dim Fehler&
  If DTRAN Then
    Fehler = EscapeCommFunction(ComHandle, SETDTR)
  Else
    Fehler = EscapeCommFunction(ComHandle, CLRDTR)
  End If
  If Fehler <> 0 Then DTR = True
End Function

Public Function RTS(RTSAN As Boolean) As Boolean
  Dim Fehler&
  If RTSAN Then
    Fehler = EscapeCommFunction(ComHandle, SETRTS)
  Else
    Fehler = EscapeCommFunction(ComHandle, CLRRTS)
  End If
  If Fehler <> 0 Then RTS = True
End Function

 Public Function TXD(TXDAN As Boolean) As Boolean
  Dim Fehler&
  If TXDAN Then
    Fehler = SetCommBreak(ComHandle)
  Else
    Fehler = ClearCommBreak(ComHandle)
  End If
  If Fehler <> 0 Then TXD = True
  End Function

Public Function RLSDstatus() As Boolean
  Dim Status&
  GetCommModemStatus ComHandle, Status
  If Status And MS_RLSD_ON Then
    'Brücke zwischen DTR und CTS, wenn DTR-ON
    RLSDstatus = True
  Else
    RLSDstatus = False
  End If
End Function

Public Function RINGstatus() As Boolean
  Dim Status&
  GetCommModemStatus ComHandle, Status
  If Status And MS_RING_ON Then
    'Brücke zwischen DTR und CTS, wenn DTR-ON
    RINGstatus = True
  Else
    RINGstatus = False
  End If
End Function

Public Function CTSstatus() As Boolean
  Dim Status&
  GetCommModemStatus ComHandle, Status
  If Status And MS_CTS_ON Then
    'Brücke zwischen DTR und CTS, wenn DTR-ON
    CTSstatus = True
  Else
    CTSstatus = False
  End If
End Function

Public Function DSRstatus() As Boolean
  Dim Status&
  GetCommModemStatus ComHandle, Status
  If Status And MS_DSR_ON Then
    'Brücke zwischen DTR und DSR, wenn DTR-ON
    DSRstatus = True
  Else
    DSRstatus = False
  End If
End Function