Stiskněte "Enter" pro přeskočení obsahu

Až 12 vstupů na sériovém portu

0

Při vytváření jednoho programu jsem se setkal s problémem – u sériového portu nepotřebuji žádné výstupy, ale alespoň 5 vstupů.

Šlo by to řešit pomocí I/O COM karty, ale i když by byla zjednodušená (bez výstupů) potřeboval bych hodně součástek. Napadlo mě ovšem „geniální“ a jednoduchý řešení – s COM portem nebudeme dělat vůbec nic, za to se vše pořeší softwarově.

K ovládání COM portu používám knihovnu RSCOM.dll. Tuto knihovnu stačí vložit do složky s programem a ve VisualStudiu do projektu vložit Modul, do kterého vložíte tento kód:

Public pTXD As Boolean
Public pDTR As Boolean 
Public pRTS As Boolean
Declare Function OPENCOM Lib „RSCOM“ (ByVal OpenString$) As Integer
Declare Sub TIMEOUTS Lib „RSCOM“ (ByVal b%)
Declare Sub BUFFERSIZE Lib „RSCOM“ (ByVal b%)
Declare Sub CLOSECOM Lib „RSCOM“ ()
Declare Sub SENDBYTE Lib „RSCOM“ (ByVal Dat%)
Declare Function READBYTE Lib „RSCOM“ () As Integer
Declare Sub SENDSTRING Lib „RSCOM“ (ByVal Dat$)
Declare Function READSTRING Lib „RSCOM“ () As String
Declare Sub CLEARBUFFER Lib „RSCOM“ ()
Declare Function INBUFFER Lib „RSCOM“ () As Integer
Declare Function OUTBUFFER Lib „RSCOM“ () As Integer
Declare Sub DTR Lib „RSCOM“ (ByVal b%)
Declare Sub RTS Lib „RSCOM“ (ByVal b%)
Declare Sub TXD Lib „RSCOM“ (ByVal b%)
Declare Function CTS Lib „RSCOM“ () As Integer
Declare Function DSR Lib „RSCOM“ () As Integer
Declare Function RI Lib „RSCOM“ () As Integer
Declare Function DCD Lib „RSCOM“ () As Integer
Declare Function INPUTS Lib „RSCOM“ () As Integer
Declare Sub TIMEINIT Lib „RSCOM“ ()
Declare Function TIMEREAD Lib „RSCOM“ () As Double
Declare Sub DELAY Lib „RSCOM“ (ByVal ms As Double)
Declare Sub REALTIME Lib „RSCOM“ ()
Declare Sub NORMALTIME Lib „RSCOM“ ()

Příslušný port lze otevřít příkazem

'Kontrola, zda je port volný 
If OPENCOM(„COM1,1200,N,8,1“) = 0 Then 
 MsgBox(„Port obsazen!“) 
End If
'Otevře port COM1
OPENCOM(„COM1,1200,N,8,1“)
'Uzavření portu
CLOSECOM()
V programu poté stačí jednoduchými příkazy otevřený port ovládat
'Nastavení všech třech výstupů na log. 1 
DTR(1) 
TXD(1) 
RTS(1)
'Nastavení všech třech výstupů na log. 0
DTR(0)
TXD(0)
RTS(0)
'Četní vstupů (funkce vrátí datový typ Integer)
Vystup = DCD
Vystup = DSR
Vystup = CTS
Vystup = RI

Tlačítka budou s sériovému portu připojeny podle schématu níže.

Diody jsou v obvodu z důvody ochrany při sepnutí dvou tlačítek pod sebou – když by byl např TXD aktivní a DTR neaktivní, mohl by mezi těmito výstupy téct proud. Stačí standardní diody – ideálně s malým úbytkem napětí, myslím že 1N4148 budou postačovat.

Ke vstupům je dobré připojit pull-down (propojit vstupy přes rezistor na GND(5)) rezistory s hodnotou okolo 10 kΩ, které v případě nestisknutého tlačítka podrží nulovou logickou úroveň (není zakresleno).

 

Obslužný program je poté velice jednoduchý

Dim Vstup1(2) As Integer 
Dim Vstup2(2) As Integer 
Dim Vstup3(2) As Integer 
Dim Vstup4(2) As Integer
'první vstupy
TXD(1)
Vstup1(0) = DCD
Vstup2(0) = DSR
Vstup3(0) = CTS
Vstup4(0) = RI
TDX(0)
'druhé vstupy
DTR(1)
Vstup1(1) = DCD
Vstup2(1) = DSR
Vstup3(1) = CTS
Vstup4(1) = RI
DTR(0)
'třetí vstupy
RTS(1)
Vstup1(2) = DCD
Vstup2(2) = DSR
Vstup3(2) = CTS
Vstup4(2) = RI
RST(0)

Nejprve se zapne výstup TXD, přečtou se vstupy, ty se uloží do proměnných a výstup TXD se vypne. To samý se opakuje u dalších výstupů. Na konci „cyklu“ máme 12 proměnných, ve kterých jsou logické hodnoty jednotlivých tlačítek.

Nevýhoda proti klasickému čtení DCD, DSR, … je taková, že je potřeba při každém čtení hodnot spustit tuto smyčku. Je tedy ideální tento kód zaobalit do nějaké funkce, nebo obnovovat alespoň v Timeru.

Při testování se vyskytla jedna chyba. Někdy se stane, že se buď nestihne vypnout nějaký výstup (nebo se projevují kapacity vodičů, …) a pak to hlásí, že je sepnuto víc stejných vstupů (např. Vstup1(0), Vstup1(1), Vstup1(2)). Je tedy potřeba mezi testováním jednotlivých vstupů nějak (?) udělat časovou prodlevu. Třeba dlouhým časem v timeru a postupným testováním vstupů (viz kód níž).

Dim Vstup As Boolean
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
If Vstup Then
'první vstupy
TXD(1)
Vstup1(0) = DCD
Vstup2(0) = DSR
Vstup3(0) = CTS
Vstup4(0) = RI
TDX(0)
'přepnutí vstupu
Vstup = Not Vstup
Else
'druhé vstupy
DTR(1)
Vstup1(1) = DCD
Vstup2(1) = DSR
Vstup3(1) = CTS
Vstup4(1) = RI
DTR(0)
'přepnutí vstupu
Vstup = Not Vstup
End If
End Sub

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *