[ Pobierz całość w formacie PDF ]
.Zainteresowała mnie zasada jego działania.Instrukcja obsługi napisana była również po angielskuna jednej, małej kartce papieru.Przeczytałem, że naciśnięcie przycisku oznaczonego symbolem Ipowoduje wysłanie do urządzenia komendy I , zaś naciśnięcie O wysłanie komendy O itd.Podobną zasadą sterowania posługuje się bardzo wiele niekoniecznie prostszych urządzeń.Na zakończenie tego fragmentu naszych rozważań chciałbym poruszyć jeszcze jedentemat.Ze względu na to, że powyższy algorytm jest jednym z prostszych i krótszych, jakieprzedstawiamy w tej książce, pragnę w tym miejscu wytłumaczyć się ze sposobu, w jakiumieszczane są w programie pisane przez nas funkcje.Postępując zgodnie z kanonamiprogramowania zorientowanego obiektowo w C++Builderze, nagłówek przykładowej funkcji:int __fastcall Close_Comm(HANDLE hCommDev)należałoby zapisać następująco:int __fastcall TForm1::Close_Comm(HANDLE hCommDev)przez co jawnie stałaby się obiektem klasy TForm1, która dziedziczy własności TForm, czylibazowej klasy formularza.Postępując konsekwentnie (zresztą nie mamy innego wyboru), należypowyższą deklarację umieścić w pliku nagłówkowym RS_04.h, np.w sekcji private lubpublic, tak jak przedstawia to poniższy wydruk.Wydruk 5.5.Zawartość pliku RS_04.h//--------------------------------------------------------------------#ifndef RS_04H#define RS_04H//--------------------------------------------------------------------#include#include#include#include#include#include#include123#include//--------------------------------------------------------------------class TForm1 : public TForm{__published: // IDE-managed ComponentsTButton *CloseComm;TButton *OpenComm;TButton *SendFile;TCheckBox *CheckBox1;TCheckBox *CheckBox2;TCheckBox *CheckBox3;TBevel *Bevel1;TLabel *Label1;TSpeedButton *SpeedButton1;TSpeedButton *SpeedButton2;TSpeedButton *SpeedButton3;TSpeedButton *SpeedButton4;TSpeedButton *SpeedButton5;void __fastcall CloseCommClick(TObject *Sender);void __fastcall OpenCommClick(TObject *Sender);void __fastcall SendFileClick(TObject *Sender);void __fastcall SpeedButton1Click(TObject *Sender);void __fastcall SpeedButton2Click(TObject *Sender);void __fastcall SpeedButton3Click(TObject *Sender);void __fastcall SpeedButton4Click(TObject *Sender);void __fastcall SpeedButton5Click(TObject *Sender);private: // User declarationsint __fastcall TForm1::Close_Comm(HANDLE hCommDev);public: // User declarations__fastcall TForm1(TComponent* Owner);};//--------------------------------------------------------------------extern PACKAGE TForm1 *Form1;//--------------------------------------------------------------------#endifUżycie __fastcall TForm1:: niewątpliwie przyspiesza wywołanie napisanych przez nasfunkcji takich jak Close_Comm(), Read_Comm(), Write_Comm().Ponadto w ich treści można wprosty sposób z dużą oszczędnością kodu odwoływać się do innych obiektów formularzazadeklarowanych w sekcji __published, zwanych tutaj metodami.Jest to na pewno bardzowygodne.Pamiętajmy jednak, że zajmujemy się specyficznymi aplikacjami komunikującymi sięze światem zewnętrznym.Nawet niewielka pomyłka programisty, być może mało istotna w innegotypu programach (absolutnie nic im nie ujmując), dla nas może okazać się zgubna.Przekonasz się,jak dużo czasu zabiera testowanie takich algorytmów oraz ich konserwacja, która tak naprawdęnigdy się nie kończy.Używając __fastcall TForm1:: jest się niestety skazanym na pracę zdwoma (lub więcej) plikami jednocześnie.Dla Czytelników testujących tego typu programy możeto być trochę niewygodne.Wiele osób ceni sobie możliwość szybkiego usunięcia funkcji z124programu w momencie, kiedy nie jest już potrzebna jak również możliwość szybkiegozmodyfikowania jej nagłówka lub listy parametrów.Dlatego nowe funkcje będę deklarował tradycyjnie , używając jedynie konwencji __fastcall, również dla przejrzystości kodu.Wysyłamy plikiCzytając poprzednie podrozdziały nauczyliśmy się wysyłać pojedyncze znaki oraz ichciągi w postaci jawnie deklarowanych C-łańcuchów.Poznaliśmy też prosty sposób przesłaniapliku znak po znaku.Czas abyśmy zobaczyli, jak można je przesyłać i odbierać, wykorzystującbufor transmisyjny oraz inne funkcje Win32 API.Ale zanim przejdziemy do zasadniczego tematutego fragmentu naszej książki, pragnę zaprezentować pewną strukturę wraz z jej pokrewnymifunkcjami.Jest nią COMMTIMEOUTS.Dodajmy w tym miejscu, że jej znajomość nie jest wcalewymagana do zrealizowania asynchronicznej transmisji szeregowej z poziomu Windows, niemniejjednak zdecydowałem się zamieścić jej opis w tym miejscu, aby zachować ciągłość rozważań natemat interesującej nas warstwy komunikacyjnej Win32 API.Zasoby tej struktury przedstawionesą w tabeli 5.10.Udostępniają nam one informacje o tzw.czasach przeterminowania transmisji wtrakcie przesyłania danych (ang.time out of transmission).Jest to ważny termin, z którymniektórzy na pewno już się zetknęli.Pragnę jednak dodać, że o ile rozwiązując problemy związaneze sterowaniem komputerowym, niezbyt często korzysta się z jej usług, o tyle ta znajomość możebyć przydatna w przypadku realizowania różnego rodzaju przesyłania danych pomiędzy dyskami.W pewnych przypadkach COMMTIMEOUTS determinuje zachowanie się takich funkcji jakReadFile() czy WriteFile().Tabela 5.10.Informacje zawarte w strukturze COMMTIMEOUTSTyp Element struktury WłaściwościDWORD ReadIntervalTimeout Określa maksymalny czas (milisekundy), pomiędzypojawieniem się na linii komunikacyjnej dwu znaków.W trakcie wykonywania ReadFile() czas jestliczony od momentu pojawienia się pierwszego znaku.Jeżeli przedział czasu pomiędzy nadejściem dwuznaków przekracza tą wartość, oznacza to, żeoperacja ReadFile() jest zakończona.125 Wartość 0 oznacza, że nie ustalono wymaganegookresu pomiędzy nadejściem dwu kolejnychznaków.Przypisanie wartości MAXDWORD powoduje, żeczytany znak jest pobierany z bufora natychmiastpo pojawieniu się tam.DWORD ReadTotalTimeoutMultiplier Określa mnożnik (milisekundy) użyty do obliczeniacałkowitego przedziału czasu (przeterminowanie)dla operacji czytania (odbioru).Dla wszystkich takichoperacji wartość ta jest mnożona przez liczbę bajtówprzewidzianą do odebrania z dysku lub łączakomunikacyjnego.DWORD ReadTotalTimeoutConstant Określa stałą (milisekundy) użytą do obliczaniaczasu przeterminowania operacji czytania.Dlawszystkich takich operacji wartość ta jest dodawanado ReadTotalTimeoutMultiplier i dooczekiwanej liczby nadchodzących bajtów
[ Pobierz całość w formacie PDF ]