Ovládání externích zařízení přes sériový port a Delay( )
Počítač může sloužit nejenom jako chytrý psací stroj nebo kalkulačka, ale může
ovládat i jiná zařízení k němu připojená. Pokud zprostředkujeme počítači vhodné
vstupy a výstupy, můžeme počítač použít k měření, regulaci či ovládání jiných
přístrojů a zřízení.
Pro tento účel, pokud pomineme speciální desky, se jeví
nejlepší k použití standardní rozhraní tiskárny a sériových linek.
Pomocí programového vybavení a vhodného hardware připojeného na standardní
porty můžeme svůj počítač rozšířit o vstupy, výstupy, připojit AD převodník a
pomocí něho měřit napětí, proudy snímat výstupy různých snímačů a čidel,
případně připojit externí LCD displej. Příklady jednoduchých zařízení je možno
najít na stránkách I2C Školky.
Port tiskárny - poskytuje 8 datových linek pro vstup nebo výstup dle režimu
portu a několik vstupních a výstupních linek.
Sériový port - poskytuje 5 vstupních a 3 výstupní linky.
Pro seznámení s prací s těmito porty pod DOSem doporučuji
knihu „Využití rozhraní PC“ od Burkhard Kainka.
V této knize je dobře a podrobně popsáno použití portů na různých příkladech.
Příklady uvedené v knize jsou napsány v Turbo Pascalu a v Basicu.
Pokud chceme používat porty pod operačním systémem Windows existuje obdobná kniha
„Využití rozhraní PC pod Windows“ od stejného autora.
Probírá obdobné příklady jako pod DOSem, jen jako programovací jazyky jsou
použity DELPHI a Visual Basic.
Dále je popisováno jen ovládání sériových portů..
Tyto jsou ve většině počítačů
dva a využit je většinou jen jeden pro myš, případně žádný pokud je myš
připojena přes zásuvku PS2 nebo přes USB. Dalším důvodem pro použití sériových
portů pod Windows je jejich přímá podpora systémem mnoha funkcemi.
Není zde popsáno využití sériových komunikačních portů v
jejich základním použití, to je pro sériovou komunikaci, ale využití vstupu a výstupu v
bitovém režimu. Pokud budeme chtít použít sériové porty pro sériovou komunikaci,
bude nejlepší využít komponenty pro komunikaci, např:
„ComPort Library“ od Dejan Crnila
Na Sériovém portu jsou k dispozici jsou tyto linky:
Vstupní
CTS
DSR
DCD
RING
Výsupní
RTS
DTR
TX
Pokud nevíte jak jsou jednotlivé linky rozloženy na konektoru, můžete se
podívat na článek o rozhraní RS232na HW.CZ.
PortCom.h - hlavičkový soubor #ifndef header_PortCom #define header_PortCom #include#include #include //--------------------------------------------------------------------------// bool OpenCom(int CisloComu); void CloseCom(void); void Wait_us(unsigned __int64 prodleva); void CloseI2C(void); void SetDTR(bool x); void SetRTS(bool x); void SetTX(bool x); bool GetCTS(void); bool GetDSR(void); bool GetRing(void); bool GetRLSD(void); void Wait_us(unsigned __int64 prodleva); void Wait_ms(int prodleva); #endif
PortCom.C - funkce pro přístup a čtení linek seriového poru. #include "PortCom.h" HANDLE ComHandle; //Handle pro COM //--------------------------------------------------------------------------// // Otevr COM port pro dalsi pouziti bool OpenCom(int CisloComu) { char JmenoComu[6]; CloseHandle(ComHandle); sprintf(JmenoComu,"COM%i",CisloComu); ComHandle=CreateFile(JmenoComu,GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL); if(ComHandle==INVALID_HANDLE_VALUE) return (0); else return (1); } //--------------------------------------------------------------------------// // Uzavre COM port void CloseCom(void) { CloseHandle(ComHandle); } //--------------------------------------------------------------------------// // Podle predaneho parametru nastavi DTR void SetDTR(bool x) { EscapeCommFunction( ComHandle,x ? SETDTR : CLRDTR ); } //--------------------------------------------------------------------------// // Podle predaneho parametru nastavi RTS void SetRTS(bool x) { EscapeCommFunction( ComHandle,x ? SETRTS : CLRRTS ); } //--------------------------------------------------------------------------// // Podle predaneho parametru nastavi TX void SetTX(bool x) { EscapeCommFunction( ComHandle,x ? SETBREAK : CLRBREAK ); } //--------------------------------------------------------------------------// // Nacte stav vstupu CTS bool GetCTS(void) { DWORD ModemStatus; GetCommModemStatus(ComHandle,&ModemStatus); ModemStatus=ModemStatus & MS_CTS_ON; return ((bool)ModemStatus); } //--------------------------------------------------------------------------// // Nacte stav vstupu DSR bool GetDSR(void) { DWORD ModemStatus; GetCommModemStatus(ComHandle,&ModemStatus); ModemStatus=ModemStatus & MS_DSR_ON; return ((bool)ModemStatus); } //--------------------------------------------------------------------------// // Nacte stav vstupu RING bool GetRing(void) { DWORD ModemStatus; GetCommModemStatus(ComHandle,&ModemStatus); ModemStatus=ModemStatus & MS_RING_ON; return ((bool)ModemStatus); } //--------------------------------------------------------------------------// // Nacte stav vstupu RLSD bool GetRLSD(void) { DWORD ModemStatus; GetCommModemStatus(ComHandle,&ModemStatus); ModemStatus=ModemStatus & MS_RLSD_ON; return ((bool)ModemStatus); } //--------------------------------------------------------------------------// // Prodlevu v mikrosekundach void Wait_us(unsigned __int64 prodleva) { unsigned __int64 frekvence,citac,stop; QueryPerformanceCounter((LARGE_INTEGER *)&citac); QueryPerformanceFrequency((LARGE_INTEGER *)&frekvence); stop=((prodleva*frekvence)/1000000)+citac+1; while (stop>citac) QueryPerformanceCounter((LARGE_INTEGER *)&citac); } //--------------------------------------------------------------------------// // Prodleva v milisekundach void Wait_ms(int prodleva) { int stop ; timeBeginPeriod (1); stop = timeGetTime() + prodleva; while (stop>timeGetTime ()); timeEndPeriod (1); } //---------------------------------------------------------------------------
Vlastní program, bliká na DTR COM1: #include#include "PortCom.h" //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { OpenCom(1); while (1) { SetDTR(true); Wait_ms(200); SetDTR(false); Wait_us(200000); } } //---------------------------------------------------------------------------