do ÂściÂągnięcia > pobieranie > ebook > pdf > download

[ Pobierz całość w formacie PDF ]
.Wszystkie urz¹dzenia zewnêtrzne, ³¹cznie z koñcówk¹u¿ytkownika traktowane s¹ jako pliki wchodz¹ce w sk³ad systemu plików.Komunikacja programu z urz¹dzeniami zewnêtrznymi realizowana jest poprzezjednorodny, wspólny aparat systemu plików, którego najbardziej podstawowymifunkcjami s¹: CreateFile(), ReadFile() oraz WriteFile().Ktoœ móg³by zapytaæ: no dobrze, ale sk¹d bêdê wiedzia³ ile bajtów mamprzeczytaæ? Czy nadaj¹cy bêdzie musia³ mnie o tym za ka¿dym razem informowaæ?Odpowiedzi poszukajmy, œledz¹c kod zaprojektowanej przez nas funkcjiRead_Comm():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³yobszar pamiêci reprezentowany przez bufor danych.Musi on mieæ mo¿liwoœæelastycznego dostosowywania siê do liczby bajtów przychodz¹cych do ³¹cza.Natym prostym przyk³adzie widzimy, jak po¿yteczna okaza³a siê znajomoœæ strukturyCOMSTAT.Ju¿ nie musimy ci¹gle monitorowaæ zawartoœci bufora.Jeœliwykorzystamy w³asnoœæ elementu cbInQue (count bytes input queue — por.tab.5.2), odczyt danych bêdzie bardzo prosty.nNumberOfBytesToRead automatyczniedostosuje siê do rozmiaru danych w buforze.Maksymalny dopuszczalny rozmiarbufora danych zostanie przekazany funkcji poprzez parametr Buf_Size.Wprzypadku, kiedy w buforze nie bêdzie ¿adnego znaku do odebrania (Stat.cbInQue= 0), nale¿y wskaŸnikowi lpNumberOfBytesRead przypisaæ 0.Je¿eli natomiast niebêdziemy chcieli skorzystaæ z us³ug COMSTAT, w funkcji ClearCommError()wskaŸnikowi lpStat wystarczy przypisaæ NULL.Zauwa¿my, ¿e podobnie jak w przypadku wysy³ania komunikatów, równie¿ funkcjaodczytuj¹ca dane pojawiaj¹ce siê w ³¹czu szeregowym mo¿e byæ zapisana wprostszy sposób z trzema lub nawet dwoma parametrami formalnymi, co ju¿ w pe³nibêdzie usprawiedliwia³o u¿ycie konwencji przekazywania parametrów __fastcall.Buffer_I : ARRAY[0.cbInQueue] of Char; // bufor wejœciowy.int __fastcall Read_Comm(HANDLE hCommDev,LPDWORD lpNumberOfBytesRead, DWORD Buf_Size){.{.ReadFile(hCommDev, &Buffer_I[0], nNumberOfBytesToRead,lpNumberOfBytesRead, NULL);}else*lpNumberOfBytesRead = 0;return TRUE;}Korzystaj¹c z tego zapisu w wywo³aniu funkcji API ReadFile(), nale¿y jawnieodwo³aæ siê do bufora danych wejœciowych Buffer_I.U¿ywaj¹c w deklaracji funkcji konwencji __fastcall nale¿y siê spodziewaæ, ¿etrzy pierwsze parametry funkcji mog¹ byæ umieszczone w rejestrach EAX, EDX orazECX (je¿eli oczywiœcie jest to mo¿liwe).Parametry 8-bitowe typu char (signedoraz unsigned) mog¹ byæ umieszczane w AL, DL, CL, parametry 16-bitowe typushort (signed oraz unsigned) w AX, DX, CX, zaœ 32-bitowe typu int/long (signedoraz unsigned) w rejestrach EAX, EDX, ECX — zob.rozdzia³ 4.Rejestry nie bêd¹ u¿ywane, je¿eli parametrami funkcji bêd¹ danezmiennopozycyjne lub struktury.Parametry tego typu s¹ odk³adane na stosie.Na zakoñczenie tej czêœci naszych rozwa¿añ celowym bêdzie skomentowanie faktuumieszczenia funkcji ClearCommError() w segmencie odbieraj¹cym komunikatyprzychodz¹ce do portu szeregowego.Zapewne nie ma wœród nas nikogo, kto nierozegra³by kiedykolwiek meczu pi³karskiego.Zawsze w lepszej sytuacji jestzawodnik podaj¹cy pi³kê, odbieraj¹cy musi bardzo uwa¿aæ, ¿eby dok³adnie j¹przyj¹æ i dalej rozegraæ.Dok³adnie tak samo jest przy komunikacjikomputerowej.Wiem z w³asnego doœwiadczenia, ¿e 90% b³êdów powstaje niestety postronie odbieraj¹cego dane.Bardzo ³atwo mo¿na siê przekonaæ, ¿e funkcjaRead_Comm() bez ClearCommError() w wielu przypadkach po prostu by nie dzia³a³a!U¿ywaj jej zawsze, nawet je¿eli podstawi³eœ dcb.fAbortOnError = FALSE (patrztabela 5.5).Przyk³adowa aplikacjaZanim przejdziemy do bardziej ambitnych rozwa¿añ, zapoznamy siê z ogóln¹ metod¹konstruowania w C++Builderze algorytmów pomocnych w realizacji transmisjiszeregowej.Kompletnym przyk³adem aplikacji wykorzystuj¹cej skonstruowane przeznas funkcje zapisu i odczytu danych bêdzie projekt\KODY\BUILDER\RS_03\p_RS_03.bpr.Dzia³anie aplikacji bêdzie polega³o nawys³aniu odpowiedniego komunikatu do przyrz¹du pomiarowego oraz wyœwietleniu izapisaniu na dysku odpowiedzi.Z czysto praktycznych wzglêdów zastosujemy tunajprostsz¹ metodê zapisu danych do pliku.Wygl¹d g³Ã³wnego formularza oraz jegokod RS_03.cpp przedstawione s¹ poni¿ej.Rysunek 5.4.Formularz g³Ã³wny projektu p_RS_03.bprDo jego zaprojektowania wykorzysta³em piêæ komponentów typu TCheckBox, zapomoc¹ których mo¿na wybraæ prêdkoœæ transmisji oraz numer portu szeregowego.Wten sam sposób mo¿na wzbogaciæ aplikacjê o mo¿liwoœæ wyboru parzystoœci, bitówstopu czy rozmiaru bitów danych.Wizualizacja odbieranych komunikatów bêdziemo¿liwa dziêki zastosowaniu komponentu typu TEdit.Obs³ugê zdarzeñ polegaj¹cychna otwarciu portu do transmisji, wys³aniu i odebraniu danych oraz zamkniêciuportu zapewniaj¹ komponenty TButton.Z przyciskiem Wyœlij skojarzona bêdziefunkcja obs³ugi zdarzenia SendClick(), w którym wywo³ywane bêd¹ nasze funkcjeWrite_Comm() oraz Read_Comm().Pozosta³e przyciski pe³ni¹ tak¹ sam¹ rolê jak wprzypadku programu testuj¹cego ³¹cze.Za pomoc¹ przedstawionego ni¿ej programutestowa³em transmisjê z pewnym przyrz¹dem zwanym kontrolerem temperatury.Wys³a³em do miernika zapytanie o jego identyfikacjê (ID).Ka¿dy nowoczesnyprzyrz¹d pomiarowy powinien nam siê przedstawiæ.Wiêkszoœæ z nich, niezale¿nieod przeznaczenia i firmy, w której zosta³y wyprodukowane, robi to w odpowiedzina standardow¹ komendê – zapytanie: *IDN? — Identification query, podaj¹c nazwêproducenta, numer fabryczny i kolejny numer modelu.Równie¿ zapytanie np [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • klimatyzatory.htw.pl