[ Pobierz całość w formacie PDF ]
.W programie sterującym łączem szeregowym można ją wywołać jedynie zparametrami domyślnymi.Będzie wówczas usuwała, w miarę swojej możliwości, wszystkieewentualne błędy pojawiające się w trakcie transmisji.ClearCommError(hCommDev, &Errors, &Stat);Wskaznik lpStat wskazuje na strukturę COMSTAT.Chcąc wyjaśnić jego znaczenie, musimyodwołać się do tej struktury będącej również częścią Win32 API.Zawiera ona informacje oaktualnych zasobach i dodatkowych sposobach kontroli wybranego łącza szeregowego.Tabela 5.9przedstawia znaczenie zawartej tam informacji.Tabela 5.9.Informacje zawarte w elementach struktury COMSTATTyp Element struktury Właściwości Wartość zwracana ,ZnaczenieDWORD fCtsHold Określa, czy transmisja jest TRUE / 1wstrzymywana do czasu Transmisja jest wstrzymana.104 odebrania przez komputer FALSE / 0sygnału CTS.Transmisja nie jest wstrzymywana.DWORD fDsrHold Określa, czy transmisja jest TRUE / 1wstrzymywana do czasu Transmisja jest wstrzymana.odebrania przez komputer FALSE / 0sygnału DSR.Transmisja nie jest wstrzymywana.DWORD fRlsdHold Określa, czy transmisja jest TRUE / 1wstrzymywana do czasu załączenia Transmisja jest wstrzymana.stanu aktywnego na linii DCD.FALSE / 0Linia DCD oznacza też RLSD Transmisja nie jest wstrzymywana.(Received Line Signal Detect).DWORD fXoffHold Określa, czy transmisja jest TRUE / 1wstrzymywana po odebraniu Transmisja jest wstrzymana.znaku sterującego XOFF.FALSE / 0Transmisja nie jest wstrzymywana.DWORD fXoffSent Określa, czy transmisja jest TRUE / 1wstrzymywana po wysłaniu Transmisja jest wstrzymana.znaku sterującego XOFF.Następnym wysłanymznakiem będzie XON, bezwzględu na aktualnietransmitowany znak.FALSE / 0Transmisja nie jest wstrzymywana.105 DWORD fEof Określa, czy został wykryty TRUE / 1znacznik końca pliku EOF.Odebrano znak EOF.Komentarz: Czy nieFALSE / 0zapomniano tu podać znaczeniazaznaczonej wartości?DWORD fTxim sterowanie transmisją TRUE / 1Jeżeli w buforze znajduje się znakwysyłany za pomocą funkcjiTransmitCommChar(), to maon pierwszeństwo przed innymi,już znajdującymi się w buforzewyjściowym.FALSE / 0Znak wysyłany funkcjąTransmitCommChar() nie będziemiał pierwszeństwa przed innymi.DWORD fReserved zarezerwowane, nie używaneDWORD cbInQue liczba bajtów danych otrzymanych należy je odczytaćw wyniku transmisji szeregowej,ale jeszcze nie przeczytanychDWORD cbOutQue liczba bajtów danych pozostających do należy je odczytaćwysłania106 Większość pól COMSTAT to pola jednobitowe.Wyjątkiem jest dwudziestopięciobitowe, obecnienie używane pole fReserved.W Win32 API struktura ta deklarowana jest w sposób następujący:typedef struct _COMSTAT {DWORD fCtsHold : 1;.} COMSTAT, *LPCOMSTAT;Deklaracja ta tworzy dwa nowe słowa kluczowe typu COMSTAT (struktura) i LPCOMSTAT(wskaznik do struktury).Tak naprawdę na tym etapie rozważań będzie nam potrzebna tylko jedna ze zmiennychoferowanych przez COMSTAT.Ale zanim pokażemy, jak ją optymalnie wykorzystać, przypatrzmysię funkcji:BOOL ReadFile(HANDLE hCommDev,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped);Użycie jej w programie zapewni nam odczytanie wszelkich danych przychodzących do łączaszeregowego identyfikowanego przez hCommDev.Można ją stosować zarówno do wariantutransmisji synchronicznej jak i asynchronicznej.lpBuffer jest dobrze nam znanymwskaznikiem do bufora danych, przez który będziemy odczytywać wszelkie informacje.nNumberOfBytesToRead określa liczbę bajtów do odebrania, zaś lpNumberOfBytesReadbędzie wskazywać na liczbę bajtów rzeczywiście odebranych.Aby nie dopuścić do przekroczeniarozmiaru bufora danych wejściowych, liczba bajtów faktycznie odebranych może być mniejsza niżnNumberOfBytesToRead, dlatego funkcja umieszcza ją w zmiennej lpNumberOfBytesRead,stanowiącej przedostatni parametr.W ten sposób działa mechanizm ochrony dla danychodbieranych.Wskaznik lpOverlapped, tak jak poprzednio w funkcji WriteFile(),zignorujemy (NULL).Win32 operacje wejścia-wyjścia realizuje za pomocą czytania z plików lub pisania do plików.Wszystkie urządzenia zewnętrzne, łącznie z końcówką użytkownika traktowane są jako plikiwchodzące w skład systemu plików.Komunikacja programu z urządzeniami zewnętrznymirealizowana jest poprzez jednorodny, wspólny aparat systemu plików, którego najbardziejpodstawowymi funkcjami są: CreateFile(), ReadFile() oraz WriteFile().Ktoś mógłby zapytać: no dobrze, ale skąd będę wiedział ile bajtów mam przeczytać? Czy nadającybędzie musiał mnie o tym za każdym razem informować? Odpowiedzi poszukajmy, śledząc kodzaprojektowanej przez nas funkcji Read_Comm():107 int __ fastcall Read_Comm(HANDLE hCommDev, LPVOID lpBuffer,LPDWORD lpNumberOfBytesRead, DWORD Buf_Size){COMSTAT Stat;DWORD Errors;DWORD nNumberOfBytesToRead;ClearCommError(hCommDev, &Errors, &Stat);if (Stat.cbInQue > 0){if (Stat.cbInQue > Buf_Size)nNumberOfBytesToRead = Buf_Size;elsenNumberOfBytesToRead = Stat.cbInQue;ReadFile(hCommDev, lpBuffer, nNumberOfBytesToRead,lpNumberOfBytesRead, NULL);}else*lpNumberOfBytesRead = 0;return TRUE;}Jej nagłówek równie dobrze może być zapisany w ten sposób:int __fastcall Read_Comm(HANDLE hCommDev, void *Buffer,DWORD *NumberOfBytesRead, DWORD Buf_Size)Ale na pewno nie tak:int __ fastcall Read_Comm(., const void *Buffer,.,.)// LPCVOID lpBufferNie należy w deklaracji funkcji odczytującej dane wskazywać na jakiś stały obszarpamięci reprezentowany przez bufor danych.Musi on mieć możliwość elastycznegodostosowywania się do liczby bajtów przychodzących do łącza.Na tym prostym przykładziewidzimy, jak pożyteczna okazała się znajomość struktury COMSTAT.Już nie musimy ciąglemonitorować zawartości bufora.Jeśli wykorzystamy własność elementu cbInQue (count bytesinput queue  por.tab.5.2), odczyt danych będzie bardzo prosty.nNumberOfBytesToReadautomatycznie dostosuje się do rozmiaru danych w buforze.Maksymalny dopuszczalny rozmiarbufora danych zostanie przekazany funkcji poprzez parametr Buf_Size.W przypadku, kiedy wbuforze nie będzie żadnego znaku do odebrania (Stat.cbInQue = 0), należy wskaznikowilpNumberOfBytesRead przypisać 0.Jeżeli natomiast nie będziemy chcieli skorzystać z usługCOMSTAT, w funkcji ClearCommError() wskaznikowi lpStat wystarczy przypisać NULL [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • hanula1950.keep.pl