rs232 linux win32 cz6


K U R S
Programowanie portu szeregowego
w systemach operacyjnych Linux
i Windows, część 6
Umiejętność programowej obsługi interfejsu RS232 od strony RS232 i włączany jest licznik timer-
BreakTime. Na czas trwania ocze-
komputera PC jest dziś istotnym elementem elektronicznego
kiwania (break time) przycisk Send
rzemiosła. W niniejszym kursie piszemy jak w praktyce
jest wyłączany. Aplikacja jest wy-
oprogramować port szeregowy w środowiskach Linux i Windows.
posażona w kontrolkę, która  świeci
się na jasno niebiesko (kolor cyan)
Wiele miejsca poświęcamy pisaniu przenośnych aplikacji GUI,
podczas trwania czasu break time.
które korzystają z interfejsu szeregowego i zachowują się tak samo
Po upływie tego czasu aplikacja
w systemach Windows jak i Linux. Wszystkie omawiane zagadnienia
sprawdza, jaka (i czy w ogóle) od-
poparte są szczegółowo opisanymi praktycznymi przykładami.
powiedz nadeszła. Zadanie to jest
realizowane w slocie obsługującym
Wykorzystanie łącza RS232 czasu break time wyrażonego w mi- przepełnienie licznika timerBreakTi-
w aplikacji testowej lisekundach. Następnie czyszczone me, pokazanym na list. 23. Po wy-
Funkcje obsługi interfejsu RS232 jest pole odpowiedzi, po czym za- łączeniu kontrolki i zatrzymaniu licz-
dostarczane są za pomocą klasy pytanie jest wysyłane przez łącze nika, program sprawdza za pomocą
CCommInterface. Plik nagłówkowy
tej kasy jest włączany do pliku na- List. 22. Wysyłanie jednobajtowego zapytania
void Example2WFrm::clickedSendQuery()
główkowego głównej formy aplikacji
{
//Open port
(list. 19). Klasa tej formy posiada
string port= COM1 ;
pole będące wskaznikiem do obiek-
if(pComm->Open(port,19200)==false)
{
tu interfejsu komunikacyjnego:
QString portname=port.c_str();
CCommInterface *pComm;
QMessageBox::critical(this,tr( Error ),tr( Port  )+portname+tr( opening
error. Application will terminate. ));
Obiekt tego interfejsu tworzony
this->reject();
jest dynamicznie w konstruktorze }
klasy Example2WFrm wraz z obiek-
//Read query
bool ok;
tem licznika odmierzającego czas
unsigned char qry=ui.leQuery->text().toInt(&ok,16);
break time (list. 21).
if(false==ok)
Jak wspomniano, działanie apli-
{
kacji polega na wysłaniu zapytania
QMessageBox::critical(this,tr( Error ),tr( Invalid query value. ));
pComm->Close();
i prezentacji odpowiedzi. Zapytanie
return;
jest wysyłane w chwili kliknięcia }
przycisku Send, zaś odpowiedz, bę-
//Update displayed query value
ui.leQuery->setText(QString::number(qry,16));
dąca ciągiem bajtów, prezentowana
jest w formie szesnastkowej i ASCII
//Read break time
za pomocą obiektu klasy QTableWid-
int btime=ui.leBreakTime->text().toInt(&ok);
get. Klasa ta implementuje tabelkę
if((false==ok) || (btime<0))
(siatkę) mogącą zawierać dowolne
{
widgety. Odpowiedz jest sprawdza- QMessageBox::critical(this,tr( Error ),tr( Invalid break time value. ));
pComm->Close();
na po upłynięciu czasu break time
return;
liczonego od chwili wysłania zapy- }
tania. Czas ten jest ustalany przez
//Clear response window
ui.twResponse->clear();
użytkownika aplikacji i odmierzany
ui.twResponse->setRowCount(2);
za pomocą licznika timerBreakTime
ui.twResponse->setColumnCount(1);
ui.leStatus->setText(tr(  ));
typu QTimer.
Ciało slotu obsługującego klik- //Send query
ui.pbtnSendQuery->setEnabled(false);
nięcie przycisku Send przedstawio-
no na list. 22. W pierwszej kolejno- if(pComm->Write(&qry,1)!=1)
{
ści dokonywane jest otwarcie por-
QMessageBox::critical(this,tr( Error ),tr( Write error. ));
pComm->Close();
tu COM1 dla szybkości transmisji
return;
19200 bodów. Niepowodzenie skut-
}
kuje wyświetleniem odpowiedniego
QPalette pal;
komunikatu i zamknięciem aplikacji. pal.setColor(QPalette::Base,QColor(tr( cyan )));
ui.leLamp->setPalette(pal);
Jeśli port został poprawnie otwar-
ty, to z pól tekstowych odczyty- this->timerBreakTime->start(btime);
}
wane jest zapytanie oraz wartość
Elektronika Praktyczna 7/2007
89
K U R S
List. 23. Odbiór odpowiedzi
Unicode  są one implementowane
void Example2WFrm::timerBreakTimeOverflow()
przez typ QChar.
{
QPalette pal;
Drugie z wymienionych poleceń
pal.setColor(QPalette::Base,QColor(tr( black )));
powoduje stworzenie trzech plików:
ui.leLamp->setPalette(pal);
Makefile, Makefile.Debug i Makefile.
this->timerBreakTime->stop();
Release, które oczywiście umożli-
//Read response
wiają tworzenie wersji Debug i Re-
unsigned long Errors,InQue,BytesRead;
unsigned char *Input;
lease aplikacji. Kompilacji wersji
Debug dokonujemy wpisując:
pComm->CheckCommInput(&Errors,&InQue);
if(Errors!=0)
mingw32 make  f Makefile.Debug
ui.leStatus->setText(tr( *** ERROR  )+QString::number(Errors)+tr(
zaś wersji Release, wpisując:
*** ));
else
mingw32 make  f Makefile. Re-
{
if(InQue==0) lease
ui.leStatus->setText(tr( *** NO RESPONSE *** ));
Uruchomienie aplikacji może
else
{
odbyć się bez podania parametrów
ui.leStatus->setText(tr( *** OK *** ));
wywołania (co odpowiada kliknię-
//Read response
ciu myszy na pliku Example2W.
Input=new unsigned char[InQue];
exe), lub przykładowo z podaniem
if(false==pComm->Read(Input,&BytesRead,InQue))
{
stylu w jakim program ma zostać
QMessageBox::critical(this,tr( Error ),tr( Read error. ));
delete [] Input; uruchomiony. Dostępne są następu-
pComm->Close();
jące style (użytkownik może także
ui.pbtnSendQuery->setEnabled(true);
return;
definiować własne):
}
 Windows (domyślny w systemie
//Show response
Windows)
ui.twResponse->setColumnCount(BytesRead);
 WindowsXP
for(unsigned long j=0;j {
 Motif
QTableWidgetItem *hexItem = new QTableWidgetItem(QString::
number(Input[j],16));  CDE
QTableWidgetItem *charItem = new QTableWidgetItem(QString((char)
 Macintosh
(Input[j])));
 Plastique (domyślny w systemie
ui.twResponse->setItem(0, j, hexItem);
Linux)
ui.twResponse->setItem(1, j, charItem);
}
Uruchomienie aplikacji z uży-
ciem danego stylu odbywa się po
delete [] Input;
}
podaniu jego nazwy z opcją  style.
}
Przykładowo, aplikację Example2W
pComm->Close();
w stylu Plastique uruchamiamy za
ui.pbtnSendQuery->setEnabled(true);
pomocą polecenia:
}
Example2W.exe  style=plastique
funkcji CheckCommInput() ile bajtów podstawie plików zródłowych za Integracja biblioteki Qt
oczekuje w buforze wejściowym oraz pomocą wspomnianego już progra- z edytorem Code Blocks
czy nie wystąpiły błędy transmisji mu narzędziowego qmake.exe. Bę- O ile możliwa jest praca z pli-
na poziomie kontrolera UART i syste- dąc w katalogu projektu wpisujemy kami zródłowymi projektu za po-
mu operacyjnego. W przypadku błędu w linii poleceń: mocą zwykłego notatnika, to oczy-
wyświetlany jest odpowiedni komu- qmake  project wiście wygodnie jest nimi opero-
nikat. Brak odpowiedzi (zero bajtów a następnie: wać za pomocą dowolnego edytora
w buforze) jest sygnalizowany poprzez qmake przeznaczonego dla programistów,
wyświetlenie komunikatu  *** NO Pierwsze z wymienionych po- wyposażonego co najmniej w moż-
RESPONSE *** . Jeśli zaś odpowiedz leceń spowoduje stworzenie pliku liwość kolorowania składni. Edytor
nadeszła, wyświetlany jest komunikat Example2W.pro, który pokazano na Code Blocks, oprócz tej podstawo-
 *** OK *** , a odpowiedz jest od- list. 24. Plik ten stanowi informa- wej cechy, posiada między innymi
czytywana z bufora wejściowego za cję, które pliki (zarówno zródłowe, wzorzec projektu Qt, dzięki któ-
pomocą funkcji Read(). Odczytany jak i pliki *.ui) należy brać pod remu tworzenie własnego projek-
ciąg bajtów trafia do tabelki prezen- uwagę przy tworzenia plików Make- tu wykorzystującego tę bibliotekę
tującej odpowiedz (w tym przypadku file, a także dodatkowe opcje. Linia: jest wyjątkowo łatwe. Posiada on
każdy z jej elementów przechowuje DEFINES  = UNICODE także możliwość współpracy z de-
obiekt klasy QString). Na koniec port została dodana ręcznie po to, buggerem GDB, będącym częścią
szeregowy jest zamykany, a przycisk aby biblioteka Qt traktowała znaki środowiska MinGW, co znakomicie
Send ponownie włączany. char jako znaki ASCII, a nie jak ułatwia (a niekiedy wręcz warun-
znaki zapisane w Unicode (Wide kuje) proces tworzenia aplikacji.
Kompilacja i uruchomienie Char). Jest to potrzebne, bo pro- Ponadto, integracja z GDB jest do-
programu z linii poleceń totypy funkcji WinAPI wymagają konywana automatycznie, a progra-
Przed kompilacją projektu, nale- typu ASCII. Mimo to, biblioteka Qt mista otrzymuje wygodne środowi-
ży przygotować odpowiednie pliki w pełni wspiera Unicode i możliwe sko pracy z możliwością zastawia-
Makefile. Pliki te są tworzone na jest używanie 16 bitowych znaków nia pułapek breakpoint z poziomu
Elektronika Praktyczna 7/2007
90
K U R S
w e j a p l i -
kacji. Wła-
ściwe pliki
p r o j e k t u
m o ż n a
s t w o r z y ć
ręcznie. Po
stworzeniu
p r o j e k t u
należy od-
powiednio
s k o n fi g u -
rować śro-
d o w i s k o ,
wybierając Rys. 9. Opcje projektu  pliki nagłówkowe
opcję Pro-
Rys. 6. Środowisko Code Blocks podczas pracy z aplika- ject >Bu-
cją Example2W ild options.
D z i ę k i
interfejsu graficznego, podglądu użyciu wzorca projektu Qt,
zmiennych i różnymi rodzajami w sekcji konsolidatora są
pracy krokowej. Ogólny widok już wymienione potrzebne
edytora Code Blocks podczas pra- biblioteki (rys. 8). Bardzo
cy nad niniejszą aplikacją przed- ważne jest właściwe poda-
stawiono na rys. 6. nie ścieżek do plików na-
Podczas tworzenia nowego pro- główkowych biblioteki Qt.
jektu (Project >New project...) pro- Jest to o tyle istotne, że
ponuję, zgodnie z rys. 7, zaznaczyć  przynajmniej w wersji 1.0
opcję  Do not create any files . edytora  domyślne ścieżki
Dzięki temu unika się tworzenia są błędne i nie pasują do
niepotrzebnych plików przykłado- wersji 4.0.1 biblioteki. Być Rys. 10. Opcje projektu  biblioteki
może jest to relikt pozo-
stały z wersji 3.x. Przykład
właściwie podanych ścieżek
przedstawiono na rys. 9.
Można dodać ścieżki do-
stępu do pozostałych pod-
katalogów katalogu \inclu-
de, ale można też pozosta-
wić jedynie dwie pierwsze
ścieżki i włączając pliki na-
główkowe podawać, oprócz
samej nazwy pliku, ścieżkę
dostępu do niego, odniesio-
ną do jednego z katalogów
wymienionych w zakładce
Directories/Compiler. Drugie Rys. 11. Opcje projektu  kompilator
Rys. 7. Nowy projekt Code Clocks rozwiązanie jest bezpiecz-
niejsze i takie też zostało jest  g. Jej zaznaczenie spowoduje
wybrane. stworzenie wersji Debug, odznacze-
Podobnie jak w przypad- nie  wersji Release.
ku nazw bibliotek, ścieżka Przed przystąpieniem do kompi-
do katalogu je zawierające- lacji projektu za pomocą IDE Code
go powinna być poprawnie Blocks należy za pomocą programu
ustalona, co jest zapew- narzędziowego moc.exe stworzyć,
nione dzięki wykorzysta- na podstawie pliku nagłówkowego
niu wzorca projektu Qt formy Example2WFrm.h, specjalny
(rys. 10). Ustawienia opcji plik moc_Example2WFrm.cpp. Plik
kompilatora (rys. 11) zależą ten powinien być umieszczony
od tego, co chcemy otrzy- w katalogu projektu i dodany do
mać w wyniku kompilacji projektu w środowisku Code Blocks.
oraz jak proces kompilacji Utworzenia pliku moc_Example2W-
ma przebiegać. Jedną z naj- Frm.cpp dokujemy wydając nastę-
Rys. 8. Opcje projektu  konsolidator bardziej użytecznych opcji pujące polecenie:
Elektronika Praktyczna 7/2007
91
K U R S
List. 24. Plik Example2W.pro
######################################################################
# Automatically generated by qmake (2.00a) Cz 18. maj 23:36:02 2006
######################################################################
TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += CommInterface.h Example2WFrm.h
FORMS += Example2WFrm.ui
Rys. 12. Aplikacja testowa działająca SOURCES += CommInterface.cpp main.cpp Example2WFrm.cpp
DEFINES -= UNICODE
w systemie Windows (styl Windows)
moc  o moc_Example2WFrm.cpp winien on być używany dla każde- Jeśli zaznaczono opcję  g, to pro-
Example2WFrm.h go pliku nagłówkowego zawierające- gram jest gotowy do uruchomienia
Działanie takie nie było po- go deklarację klasy, która zawiera w trybie debuggowania  wystarczy
trzebne podczas kompilacji progra- w sobie wywołanie makra Q_OB- ustawić pułapki w wybranych miej-
mu w linii poleceń, gdyż program JECT. Pliki wygenerowane przez scach programu i wcisnąć F8. Apli-
qmake sam umieszczał w plikach program moc muszą być skompilo- kację testową działającą w systemie
Makefile stosowne wywołania pro- wane i skonsolidowane razem z in- Windows przedstawiono na rys. 12.
gramu moc. Program ten zajmuje nymi plikami projektu. Arkadiusz Antoniak, EP
się obsługą rozszerzeń języka C++ Po wygenerowaniu pliku moc_ arkadiusz.antoniak@ep.com.pl
właściwych dla biblioteki Qt, m.in. Example2WFrm.cpp można skompi- www.antoniak.ep.com.pl
mechanizmu sygnałów i slotów. Po- lować i uruchomić aplikację (F9).
180x128
1/2
180x23
Elektronika Praktyczna 7/2007
92


Wyszukiwarka

Podobne podstrony:
rs232 linux win32 cz2
rs232 linux win32 cz1
rs232 linux win32 cz8
rs232 linux win32 cz7
rs232 linux win32 cz3
rs232 linux win32 cz4
rs232 linux win32 cz5
STM32 Butterfly RS232
Linux 2000 DVB T Experiments
linux kobiety
compilar linux
Linux IPCHAINS HOWTO Appendix Differences between ipchains and ipfwadm
systemy operacyjne cw linux apache mysql
Linux materialy
Linux System Plików
Asembler linux
Nauka słówek i memoryzacja na Puppy Linux
linux 1 00

więcej podobnych podstron