mylms.cz

... web o elektronice


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

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).

seriove-vstupy-1


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

 



Napsal Petan před sedmi roky v kategorii Elektronika Programy. Připojeno 0 komentářů.
Přečteno 7592x.

Na programy zde poskytované není žádná záruka na funkčnost. Jednotlivé články, stejně jako celý obsah stránek není návodem a slouží pouze k studijním účelům. Zapojení výše mají pouze informativní charakter! Vždy se řiďte originálním návodem k použití! Na elektrickém (vyhrazeném) zařízení smí pracovat pouze osoba s příslušnou kvalifikací dle vyhlášky 50/78 Sb! Vše tedy děláte na vlastní nebezpečí! Autor stránek nebere žádnou zodpovědnost za případné újmy na zdraví, životě, majetku a jiné!

I když jsou články psány s co největší pečlivostí, mohou obsahovat chyby. Vše tedy bez záruky!

Jakékoliv části webu je zakázáno bez svolení autora a uvedení zdroje publikovat! Některé části článků mohou obsahovat texty, případně obrázky ze stránek Wikipedia a Wikimedia Commons. Tyto části jsou dostupné pod původní licencí Creative Commons.



Doposud nebyl připojen žádný komentář. Buďte první!

Připojte váš komentář!

Hvězdičkou jsou označena povinná pole.
E-mailovou adresu k příspěvku přidávat nemusíte. Autor stránek odpovídá vždy do komentáře, ne na přiložený e-mail!
Kvůli zachování kompletnosti komentáře budou vložené odkazy na obrázky vloženy do komentáře přímo jako obrázek. Původní soubor bude zkopírován na tuto stránku.