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