[ Pobierz całość w formacie PDF ]
.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 jawnie odwołać się dobufora danych wejściowych Buffer_I.Używając w deklaracji funkcji konwencji __fastcall należy się spodziewać, że trzy pierwszeparametry funkcji mogą być umieszczone w rejestrach EAX, EDX oraz ECX (jeżeli oczywiściejest to możliwe).Parametry 8-bitowe typu char (signed oraz unsigned) mogą być umieszczanew AL, DL, CL, parametry 16-bitowe typu short (signed oraz unsigned) w AX, DX, CX, zaś32-bitowe typu int/long (signed oraz unsigned) w rejestrach EAX, EDX, ECX  zob.rozdział 4.Rejestry nie będą używane, jeżeli parametrami funkcji będą dane zmiennopozycyjne 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 komunikaty przychodzącedo portu szeregowego.Zapewne nie ma wśród nas nikogo, kto nie rozegrałby kiedykolwiek meczupiłkarskiego.Zawsze w lepszej sytuacji jest zawodnik podający piłkę, odbierający musi bardzouważ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 po stronieodbierającego dane.Bardzo łatwo można się przekonać, że funkcja Read_Comm() bezClearCommError() w wielu przypadkach po prostu by nie działała! Używaj jej zawsze, nawetjeżeli podstawiłeś dcb.fAbortOnError = FALSE (patrz tabela 5.5).Przykładowa aplikacja109 Zanim przejdziemy do bardziej ambitnych rozważań, zapoznamy się z ogólną metodąkonstruowania w C++Builderze algorytmów pomocnych w realizacji transmisji szeregowej.Kompletnym przykładem aplikacji wykorzystującej skonstruowane przez nas funkcje zapisu iodczytu danych będzie projekt \KODY\BUILDER\RS_03\p_RS_03.bpr.Działanie aplikacjibędzie polegało na wysłaniu odpowiedniego komunikatu do przyrządu pomiarowego orazwyświetleniu i zapisaniu na dysku odpowiedzi.Z czysto praktycznych względów zastosujemy tunajprostszą metodę zapisu danych do pliku.Wygląd głównego formularza oraz jego kodRS_03.cpp przedstawione są poniżej.Rysunek 5.4.Formularz głównyprojektup_RS_03.bprDo jego zaprojektowania wykorzystałem pięć komponentów typu TCheckBox, za pomocąktórych można wybrać prędkość transmisji oraz numer portu szeregowego.W ten sam sposóbmożna wzbogacić aplikację o możliwość wyboru parzystości, bitów stopu czy rozmiaru bitówdanych.Wizualizacja odbieranych komunikatów będzie możliwa dzięki zastosowaniu komponentutypu TEdit.Obsługę zdarzeń polegających na otwarciu portu do transmisji, wysłaniu i odebraniudanych oraz zamknięciu portu zapewniają komponenty TButton.Z przyciskiem Wyślij skojarzonabędzie funkcja 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 w przypadkuprogramu testującego łącze.Za pomocą przedstawionego niżej programu testowałem transmisję zpewnym przyrządem zwanym kontrolerem temperatury.Wysłałem do miernika zapytanie o jegoidentyfikację (ID).Każdy nowoczesny przyrząd pomiarowy powinien nam się przedstawić.Większość z nich, niezależnie od przeznaczenia i firmy, w której zostały wyprodukowane, robi tow odpowiedzi na standardową komendę  zapytanie: *IDN?  Identification query, podającnazwę producenta, numer fabryczny i kolejny numer modelu.Również zapytanie np.o aktualniemierzoną temperaturę (lub inną wartość) jest standardowe: CDAT? Jeżeli jednak Czytelnik nie matakiego urządzenia, program ten można testować, łącząc się z innym komputerem.Wówczaswskaznik query może wskazywać na dowolny ciąg znaków, nie dłuższy oczywiście niż110 zadeklarowany obszar pamięci (bufor danych).W tym przykładzie zadeklarowałem niecoprzesadnie bufor danych o rozmiarze 64 bajtów zarówno do nadawania jak i odbioru.Ogólnierzecz biorąc liczba przesyłanych bajtów może być całkowicie dowolna.Najczęściej używanymisą: 1, oznaczające przesłanie jednego znaku (nie buforowane) oraz 2, 8, 16, 32,., 512, 1024 i2048, co odpowiada fizycznemu rozmiarowi bloku danych akceptowanemu przez większośćnowoczesnych urządzeń zewnętrznych.Ciąg znaków wskazanych przez query zostanieskopiowany do obszaru pamięci, którego pierwszy znak jest wskazany przez bufor danychwyjściowych Buffer_O.Czynność ta zostanie wykonana za pomocą znanej funkcjistrcpy(Buffer_O, query).Rezultatem będzie dana typu char *, wskazująca pierwszy znakobszaru pamięci, do którego wykonano kopiowanie.Wydruk 5.3.Kod formularza aplikacji realizującej transmisję szeregową//----RS_03.cpp-------------//--- kompilować z borlndmm.dll oraz cc3250mt.dll --------------#include#include#pragma hdrstop#include "RS_03.h"#pragma package(smart_init)#pragma resource "* [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • agnieszka90.opx.pl