150875
numer indeksu
Grzegorz Graczyk
imię i nazwisko
151021
numer indeksu
Paweł Tarasiuk
imię i nazwisko
Data 2010-03-03
Kierunek Informatyka Rok akademicki 2009/10
Semestr 4
Grupa dziekańska 2
Laboratorium telekomunikacji
Zadanie 4
Krótki wstęp
Przygotowany przez nas program służy do prostej komunikacji terminalowej między dwoma komputerami, za pośrednictwem modemu. Program został napisany w języku C, przy wyko- rzystaniu funkcji systemu Windows. Program pozwala wybrać port szeregowy za pomocą argu- mentów. Jego działanie jest bardzo proste - tworzone są dwa wątki, z których jeden odczytuje dane wpisywane za pomocą klawiatury na standardowe wejście i przekazuje je w niezmienionej postaci na wybrany wcześniej port szeregowy, natomiast drugi wątek - odczytuje przychodzące dane z portu szeregowego i przepisuje je na standardowe wyjście. Pisząc program zadbaliśmy o prostotę i niewielką długość kodu, oraz o minimalne wykorzystanie zasobów sprzętowych ma- szyny, na której program jest uruchamiany. Praktycznym zastosowaniem, które zostanie (a w chwili czytnania tego sprawozdania - zapewne juz zostało) zademonstrowane na laboratorium jest nawizanie połączenia przez dwa różne komputery z jednym modemem. Takie podejście do problemu pozwala nam samodzielnie kierować do modemu dowolne polecenia w języku Hay- esa, oraz badać jego zachowanie w przypadku błędów. Przy demonstracji, dokonamy za pomocą modemu połączenia dwóch komputerów, posługując się uniwersalnymi rozkazami kodu Hayesa (ATD, ATA, ATH, +++). Skonfigurowanie dwóch instancji programu na dwóch komputerach tak, aby łączyły się one przez modem pozwala zatem osiągnać efekt przypominający bardzo prosty program do przesyłania wiadomości błyskawicznych bądź prowadzenia chatu.
Kod źródłowy
#i n c l u d e < s t d i o . h>
#i n c l u d e <c o n i o . h>
#i n c l u d e < s t r i n g . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <windows . h>
#d e f i n e b o o l c h a r
#d e f i n e t r u e ( ( b o o l ) 1 )
#d e f i n e f a l s e ( ( b o o l ) 0 )
BOOL bPortReady ; DCB dcb ;
COMMTIMEOUTS CommTimeouts ; BOOL bWriteRC ;
BOOL bReadRC ;
DWORD i B y t e s W r i t t e n ; DWORD i B y t e s R e a d ;
c h a r ∗ p o r t P a t h = ”COM1”;
HANDLE S e r i a l I n i t (c h a r ∗ComPortName , i n t BaudRate ) { p u t s ( ComPortName ) ;
HANDLE hComm ;
hComm = C r e a t e F i l e ( ComPortName , GENERIC READ | GENERIC WRITE, 0 , // e x c l u s i v e a c c e s s
NULL, // no s e c u r i t y
OPEN EXISTING , 1 , // no o v e r l a p p e d I /O
NULL // n u l l t e m p l a t e
) ;
bPortReady = SetupComm (hComm, 1 , 1 2 8 ) ; // s e t b u f f e r s i z e s
bPortReady = GetCommState (hComm, &dcb ) ;
dcb . BaudRate = BaudRate ; dcb . B y t e S i z e = 8 ;
dcb . P a r i t y = NOPARITY; //EVENPARITY ; dcb . S t o p B i t s = ONESTOPBIT ;
dcb . f A b o r t O n E r r o r = TRUE;
Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 2 / 4
dcb . fOutX = FALSE ; // XON/XOFF o f f f o r t r a n s m i t dcb . f I n X = FALSE ; // XON/XOFF o f f f o r r e c e i v e
dcb . fOutxCtsFlow = FALSE ; // t u r n on CTS f l o w c o n t r o l dcb . f R t s C o n t r o l = RTS CONTROL HANDSHAKE;
dcb . fOutxDsrFlow = FALSE ; // t u r n on DSR f l o w c o n t r o l dcb . f D t r C o n t r o l = DTR CONTROL ENABLE ;
dcb . f D t r C o n t r o l = DTR CONTROL DISABLE ; dcb . f D t r C o n t r o l = DTR CONTROL HANDSHAKE;
bPortReady = SetCommState (hComm, &dcb ) ; // Communication t i m e o u t s a r e o p t i o n a l
bPortReady = GetCommTimeouts (hComm, &CommTimeouts ) ;
CommTimeouts . R e a d I n t e r v a l T i m e o u t = MAXDWORD;
CommTimeouts . ReadTotalTimeoutConstant = 1 ;
CommTimeouts . R e a d T o t a l T i m e o u t M u l t i p l i e r = MAXDWORD;
CommTimeouts . W r i t e T o t a l T i m e o u t C o n s t a n t = 0 ; CommTimeouts . W r i t e T o t a l T i m e o u t M u l t i p l i e r = 0 ; bPortReady = SetCommTimeouts (hComm, &CommTimeouts ) ;
r e t u r n hComm ; }
b o o l S e r i a l G e t c (HANDLE ∗ hComm, c h a r ∗ r x c h a r ) { BOOL bReadRC ;
s t a t i c DWORD i B y t e s R e a d ;
bReadRC = R e a d F i l e ( ∗hComm, r x c h a r , 1 , &i B y t e s R e a d , NULL ) ; r e t u r n i B y t e s R e a d ;
}
v o i d S e r i a l P u t c (HANDLE ∗ hComm, c h a r t x c h a r ) { BOOL bWriteRC ;
s t a t i c DWORD i B y t e s W r i t t e n ;
i f( t x c h a r == 1 0 ) { t x c h a r = 1 3 ;
W r i t e F i l e ( ∗hComm, &t x c h a r , 1 , &i B y t e s W r i t t e n , NULL ) ; t x c h a r = 1 0 ;
}
bWriteRC = W r i t e F i l e ( ∗hComm, &t x c h a r , 1 , &i B y t e s W r i t t e n , NULL ) ; }
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
DWORD WINAPI t e r m r e a d e r (PVOID param ) { HANDLE ∗ p o r t = param ;
c h a r v a l ; b o o l ok ; w h i l e( t r u e ) {
ok = S e r i a l G e t c ( p o r t , &v a l ) ; i f( ok )
f p u t c ( v a l , s t d o u t ) ; }
}
i n t r a t e = 9 6 0 0 ; i n t term ( ) {
DWORD w a t e k 1 i d ; HANDLE w1 ;
HANDLE p o r t = S e r i a l I n i t ( p o r t P a t h , r a t e ) ;
DWORD i B y t e s W r i t t e n ;
Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 3 / 4
w1 = C r e a t e T h r e a d (NULL, 0 , t e r m r e a d e r , (PVOID) & p o r t , 0 , &w a t e k 1 i d ) ;
i n t v a l ;
i n t i = 0 , l e n = 1 ;
w h i l e( ( v a l = g e t c h ( ) ) != −1) { S e r i a l P u t c (& p o r t , v a l ) ; }
r e t u r n 0 ; }
i n t main (i n t a r g c , c h a r ∗c o n s t a r g v [ ] ) { i n t i , j ;
c o n s t c h a r ∗ p o r t , ∗ u s a g e = ” n u l l ”;
f o r( i = 1 , j = 0 ; i < a r g c ; i ++) { i f( a r g v [ i ] [ 0 ] == ’− ’)
s w i t c h ( a r g v [ i ] [ 1 ] ) { c a s e ’ r ’:
++i ;
s s c a n f ( a r g v [ i ] , ”%d”, &r a t e ) ; b r e a k;
d e f a u l t: i = a r g c ; } e l s e
s w i t c h ( j ++) { c a s e 0 :
p o r t P a t h = a r g v [ i ] ; b r e a k;
d e f a u l t: i = a r g c ; }
}
i f( i > a r g c | | ( j != 1 && j != 0 ) ) { p u t s ( u s a g e ) ;
r e t u r n −1;
}
i f( s t r c m p ( a r g v [ 1 ] , ” term ”) == 0 ) r e t u r n term ( ) ;
r e t u r n −1;
}