rs232_linux-win32_cz5.pdf
(
467 KB
)
Pobierz
rs232_linux-win32_cz5.indd
KURS
Programowanie portu szeregowego
w systemach operacyjnych Linux
i Windows, część 5
Umiejętność programowej obsługi
interfejsu RS232 od strony
komputera PC jest dziś istotnym
elementem elektronicznego
rzemiosła. W niniejszym
kursie piszemy jak w praktyce
oprogramować port szeregowy
w środowiskach Linux i Windows.
Wiele miejsca poświęcamy
pisaniu przenośnych aplikacji
GUI, które korzystają z interfejsu
szeregowego i zachowują
się tak samo w systemach
Windows jak i Linux. Wszystkie
omawiane zagadnienia poparte
są szczegółowo opisanymi
praktycznymi przykładami.
stanowił zapowiedź dobrego zestawu
narzędzi RAD (
Rapid Application De-
velopment
) dla systemów Linux i Win-
dows. Niestety, w 2005 roku firma
Borland zrezygnowała z dalszego roz-
woju środowiska Kylix, traktując je na
równi z tak leciwymi produktami jak
Borland Turbo C++. Na szczęście na
przenośnych IDE świat się nie kończy
i stworzono wiele przenośnych biblio-
tek, a więc programiści mają w czym
wybierać. Określenie „przenośnych”
dotyczy tu kodu źródłowego, a nie
– jak to ma miejsce w przypadku ję-
zyków Java, C#, czy platformy .NET
– interpretowanych na podstawie tzw.
kodu bajtowego, gdzie konieczna jest
wcześniejsza instalacja Wirtualnej Ma-
szyny Javy lub jej odpowiednika. Wy-
korzystanie bibliotek przenośnych od-
bywa się zgodnie z maksymą „napisz
raz, skompiluj (i uruchom) wszędzie”.
Ten sam kod źródłowy kompilowany
jest na różnych platformach, w wyni-
ku czego dla każdej z nich powstaje
natywny kod wykonywalny.
Najbardziej popularnymi bibliote-
kami służącymi do tworzenia aplika-
cji przenośnych są: wxWidgets (daw-
niej wxWindows), Qt, Ultimate++,
FOX, V. Różnią się one przede
wszystkim możliwościami, elegancją
dostarczanego przez nie API, łatwością
tworzenia interfejsu graficznego wspo-
sób wizualny, funkcjonalnością wersji
dostępnych bezpłatnie, jakością doku-
mentacji, czy wreszcie popularnością
i perspektywami rozwoju. Biorąc pod
uwagę wymienione cechy, toolkit Qt
(czytaj
ang. cute
– miły, sympatyczny)
wyróżnia się eleganckim API (w prze-
ciwieństwie np. do API wxWidgets,
przypominającego bibliotekę MFC),
dużymi możliwościami, dobrą doku-
mentacją (Qt Assistant) i świetnym
narzędziem do tworzenia interfej-
su użytkownika w sposób wizualny
– Qt Designer. Jest przy tym dostęp-
ny bezpłatnie w formie
Open Source
na licencji GPL, zarówno dla syste-
mu Linux jak i Windows (począwszy
od wersji 4). Jest to biblioteka stale
rozwijana przez firmę Trolltech. Co
ciekawe, w parze z jej rozwojem idzie
rozwój popularnego pulpitu dla syste-
mów linuksowych – KDE, który jest
tworzony właśnie z użyciem Qt.
Kolejną zaletą Qt jest możliwość
współpracy z wieloma kompilatorami
C++. Na potrzeby tego kursu użyto
rozwiązań
Open Source
, co zaowo-
cowało wykorzystaniem kompilato-
ra GCC, który w wersji dla systemu
Windows dostępny jest m.in. w posta-
ci pakietu MinGW.
Instalacja biblioteki Qt
i narzędzi wspomagających
w systemie Windows
Wersję
Open Source
pakietu Qt
w wersji 4.0.1, zarówno dla systemu
Windows jak i Linux, można pobrać
z
ftp://ftp.trolltech.com/qt/source/
. Dla
Windows, biblioteka jest dostarczana
w postaci pliku
qt–win–opensource–src-
–4.0.1.zip
. Archiwum należy rozpa-
kować w miejscu, w którym chcemy
mieć na dysku twardym zainstalowa-
ną bibliotekę Qt. W moim przypadku
był to katalog C:\qt–win–opensour-
ce–src–4.0.1. Ze względu na to, że
wersja darmowa, jako pakiet
Open
Source
, rozpowszechniana jest w wer-
sji źródłowej, instalacja polega na jej
skompilowaniu. W wyniku kompilacji
powstają niezbędne narzędzia i biblio-
teki. Jednak zanim przystąpimy do
kompilacji, musimy zaopatrzyć się
w kompilator, na przykład MinGW.
Kompilator ten można ściągnąć osob-
no (
http://www.mingw.org/
) lub wraz
z jednym z wielu darmowych edyto-
rów w stylu IDE. W niniejszym kur-
sie wykorzystano IDE
Code Blocks
(w skrócie C::B), dostępne wraz
z kompilatorem MinGW na stronie
internetowej
http://www.codeblocks.
org/
. Jedną z zalet tego edytora jest
to, że posiada on wzorzec (
template
)
projektu Qt, co bardzo ułatwia jego
integrację z tą biblioteką. Co ciekawe,
sam edytor jest tworzony z użyciem
konkurencyjnego pakietu wxWidgets.
Edytor C::B wraz z kompilatorem
MinGW należy zainstalować w typo-
wy dla systemu Windows sposób.
Po zainstalowaniu edytora i kom-
pilatora przystępujemy do zainstalo-
wania biblioteki Qt. Sama instalacja
tego pakietu jest szczegółowo opisana
W poprzednich częściach kur-
su poznaliśmy, w jaki sposób można
oprogramować port szeregowy w syste-
mach Linux i Windows (32–bitowych).
Została przedstawiona uniwersalna
klasa obsługi tego interfejsu, której
wykorzystanie jest możliwe z każdym
kompilatorem języka C++ i biblioteką
STL. W następnych odcinkach pokażę
przykład prostej aplikacji okienkowej
działającej w obu systemach operacyj-
nych i współpracującej z programem
Example1.c pracującym na mikrokon-
trolerze ATmega8. Funkcjonalność tej
aplikacji polega na wysłaniu jedno-
bajtowego zapytania i prezentacji od-
powiedzi przesłanej przez mikrokon-
troler, lub informacji o braku takiej
odpowiedzi. Jako narzędzie do stwo-
rzenia programu przenośnego wybrano
bibliotekę Qt 4 (wersja Qt 4.0.1
Open
Source
) firmy Trolltech.
Dlaczego Qt?
Na rynku istnieje wiele narzędzi
służących do tworzenia przenośnych
aplikacji z graficznym interfejsem
użytkownika. Do niedawna obiecują-
co zapowiadał się rozwój pakietu IDE
(
Integrated Development Environment
)
Kylix firmy Borland, który wraz ze
środowiskami Delphi i C++ Builder,
Elektronika Praktyczna 6/2007
89
KURS
Rys. 4. Tworzenie graficznego interfejsu aplikacji za pomo-
cą programu Qt Designer
bin), w czasie,
gdy tworzone
są pliki
Make-
file
projektów
przykładowych
(w tym czasie
na ekranie mo-
nitora wyświe-
tlane są napisy
„reading *.pro”
odnoszące się
do plików z ka-
talogu QTDIR\
examples);
3. Po skonfigu-
rowaniu należy
sprawdzić, czy
w katalogu QT-
DIR znajduje się
plik Makefile.
Wersje
Open Source
są dostar-
czane bez jakiejkolwiek gwaran-
cji i zdarza się, że plik ten nie
zostanie stworzony. Jeśli go nie
ma, należy utworzyć go ręcznie,
wpisując w linii poleceń:
qmake
4. W linii poleceń wpisać:
mingw32–make
Polecenie to jest wywołaniem
programu
make
właściwego dla
kompilatora MinGW. Po jego
wywołaniu nastąpi długotrwały
proces kompilacji. Wraz z jego
postępem, w katalogu QTDIR\lib
będą się pojawiać stosowne bi-
blioteki, a w katalogu QTDIR\bin
będą to biblioteki
*.dll
oraz pro-
gramy narzędziowe, między in-
nymi:
– moc.exe
(
Meta–Object Compi-
ler
). Kompilator meta obiektów
biblioteki Qt;
– uic.exe
(
User Interface Com-
piler
). Konwerter plików XML
*.ui, będących wynikiem dzia-
łania programu Qt Designer,
na kod źródłowy w języku
C++;
– designer.exe
– narzędzie do
tworzenia GUI;
– assistant.exe
– pomoc bibliote-
ki Qt;
–
linguist.exe
– narzędzie do in-
ternacjonalizacji aplikacji two-
rzonych za pomocą Qt.
5. Kompilację można przerwać
w czasie, gdy kompilowane są
przykładowe projekty. Każdy
z nich można, wedle potrzeb,
skompilować później.
Po wykonaniu opisanych czyn-
ności biblioteka Qt 4.0.1 jest goto-
wa do użycia.
Tworzenie aplikacji testowej
z GraficznymInterfejsem
Użytkownika
Wykorzystanie biblioteki Qt jest za-
gadnieniem na tyle szerokim, że z po-
wodzeniem mogłoby stanowić tematy-
kę niemałej wielkości książki. Dlatego
też opisano tylko te jego elementy,
które są najistotniejsze z punktu wi-
dzenia tematyki niniejszego kursu.
W celu zademonstrowania obsługi
łącza RS232 przez aplikację okienko-
wą, stworzono program Example2W,
którego działanie jest analogiczne do
działania programu Example1L, opi-
sanego w jednej z poprzednich części
kursu. Aplikacja umożliwia wysłanie
jednobajtowego zapytania, ustalenie
czasu
break time
oraz prezentację
odpowiedzi udzielonej przez część
sprzętową.
Tworzenie aplikacji rozpoczyna-
my od uruchomienia programu
Qt
Designer
, znajdującego się w katalo-
gu QTDIR\bin. Rozmieszczając wid-
gety (linuksowe odpowiedniki okien,
przy czym w nomenklaturze WinAPI
za okno uważa się także takie obiek-
ty, jak np. przyciski) na formie apli-
kacji należy posłużyć się zestawem
odpowiednich rozkładów (
layout
),
dzięki czemu finalny program będzie
się zachowywał sensownie, na przy-
kład podczas prób rozciągania formy.
Zachowanie formy można w każdej
chwili wypróbować za pomocą opcji
preview
(
Ctrl+R
). Dostępne są różne
style podglądu, między innymi styl
Windows czy Motif. Zrzut ekranowy
programu
Qt Designer
zrobiony pod-
czas tworzenia formy aplikacji testo-
wej, przedstawiono na
rys. 4
.
Po zaprojektowaniu wyglądu for-
my, należy ją zapisać w wybranym
katalogu, najlepiej w tym, w którym
będzie umieszczony projekt aplikacji.
Forma jest zapisywana w postaci spe-
cjalnego pliku XML z rozszerzeniem
*.ui. W przypadku aplikacji testowej
Example2W
, plik z danymi formy na-
zwano
Example2WFrm.ui
. Fragment
tego pliku przedstawiono na
list. 17
.
Aby z niego skorzystać w tworzonej
aplikacji, należy dokonać jego konwer-
sji na plik nagłówkowy języka C++.
Można to zrobić za pomocą progra-
mu narzędziowego
uic.exe
, znajdujące-
go się w katalogu QTDIR\bin. W tym
celu, będąc w katalogu projektu, nale-
ży wpisać w linii poleceń:
uic –o ui_Example2WFrm.h Example2WFrm.
ui
w pliku INSTALL, dostarczanym wraz
z nim. Niestety, jedną z największych
wad biblioteki Qt jest bardzo długi
czas instalowania, mogący dochodzić
nawet do kilku godzin (i to nawet
na całkiem szybkich komputerach).
Dlatego też warto zrezygnować za-
równo z tworzenia plików Makefile,
przykładów, jak i ich kompilacji (kod
źródłowy przykładów jest umieszczo-
ny w katalogu \examples). W razie
potrzeby można je skompilować póź-
niej. Podczas opisu instalacji i użyt-
kowania biblioteki Qt odniesienia do
katalogu w jakim ma być ona zain-
stalowana będą dotyczyć przykłado-
wego katalogu C:\qt–win–opensour-
ce–src–4.0.1. Procedura instalacji jest
następująca:
1. Nadać poniższym zmiennym śro-
dowiskowym następujące wartości:
PATH – dodać ścieżkę
C:\qt–win–opensource–src–4.0.1\bin
QTDIR=C:\qt–win–opensource–src–4.0.1
QMAKESPEC=C:\qt–win–opensource–src–
4.0.1\mkspecs\win32–g++
Dostęp do zmiennych śro-
dowiskowych w nowych syste-
mach Windows NT odbywa się
poprzez
Panel Sterowania–>Sys-
tem–>Zaawansowane–>Zmienne
środowiskowe
. Można też w linii
poleceń wpisać:
set NAZWA_ZMIENNEJ=ŚCIEŻKA
2. W linii poleceń wpisać:
configure
Program
configure
służy do
przygotowania programu
qmake
,
który z kolei służy do tworzenia
plików
Makefile
na podstawie
plików źródłowych. Zagadnienia
te zostaną opisane dalej. Dzia-
łanie programu
configure
można
przerwać po stworzeniu pro-
gramu
qmake
(katalog QTDIR\
Powyższa komenda spowoduje
stworzenie pliku
ui_Example2WFrm.h,
90
Elektronika Praktyczna 6/2007
KURS
List. 17. Fragment pliku z danymi
formy Example2WFrm.ui
<ui version=”4.0” >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>frmExample2W</class>
<widget class=”QDialog”
name=”frmExample2W” >
<property name=”geometry” >
<rect>
<x>0</x>
<y>0</y>
<width>346</width>
<height>213</height>
</rect>
</property>
<property name=”windowTitle” >
<string>Example2W – COM1</string>
</property>
Stworzenie obiektu formy i jego
uwidocznienie odbywa się w funkcji
main()
, zaimplementowanej w pliku
main.cpp
, który pokazano na
list. 20
.
List. 21. Konstruktor klasy Example-
2WFrm
Example2WFrm::Example2WFrm(QDialog
*parent)
: QDialog(parent)
{
ui.setupUi(this);
//Create members
pComm = new CCommInterface();
timerBreakTime = new
QTimer(this);
//Set text codec for tr()
function
QTextCodec::setCodecForTr(QTextCo
dec::codecForName(„ISO8859–2”));
//Connect signals and slots
connect(timerBreakTime,
SIGNAL(timeout()), this, SLOT(timer
BreakTimeOverflow()));
connect(ui.pbtnSendQuery,
SIGNAL(clicked()), this, SLOT(click
edSendQuery()));
}
List. 20. Funkcja main()
#include <QtGui/QApplication>
#include „Example2WFrm.h”
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Example2WFrm frmEx;
frmEx.show();
return app.exec();
}
Sygnały i sloty
Wiemy już, jak zbudować formę
aplikacji opartej na oknie dialogowym
i jak ją pokazać użytkownikowi. Pozo-
stało odpowiedzieć na pytanie, w ja-
ki sposób można tę aplikację ożywić,
czyli dodać funkcje obsługi zdarzeń,
takich jak na przykład kliknięcie kla-
wiszem myszki na przycisku. Otóż,
w przypadku biblioteki Qt, odbywa
się to za pośrednictwem mechani-
zmu
sygnałów i slotów
. Mechanizm
sygnałów i slotów polega na tym, że
określone zdarzenie dotyczące danego
widgeta (np. kliknięcie myszką) po-
woduje wyemitowanie przezeń sygna-
łu, zależnego od tego, jakie zdarzenie
miało miejsce. Każdy widget lub for-
ma (ogólnie: każda klasa wywodząca
się od klasy QObject) może emitować
sygnały oraz posiadać specjalne meto-
dy zwane slotami. Sloty to po prostu
funkcje wywoływane w odpowiedzi na
określone sygnały, które to sygnały
są z kolei funkcjami wywoływanymi
w przypadku wystąpienia odpowiada-
jących im zdarzeń. Aby dany slot był
wywoływany w odpowiedzi na dany
sygnał, należy go z tym sygnałem po-
łączyć za pomocą specjalnej funkcji
connect()
. Zasadę tę ilustruje
rys. 5
.
Nie każdy slot da się połączyć z da-
nym sygnałem. Połączenie jest
możliwe, gdy lista argumen-
tów slotu jest podzbiorem li-
sty argumentów sygnału. Slot,
połączony z danym sygnałem,
wywoływany jest z tymi sa-
mymi argumentami, z którymi
wywoływany jest sygnał (lub
ich podzbiorem właściwym
dla listy argumentów slotu).
Jeden slot może być połączo-
ny z dowolną liczbą sygnałów,
a jeden sygnał może być połą-
czony z dowolną liczbą slotów.
Biblioteka Qt zapewnia dużą
liczbę predefiniowanych sygna-
łów i slotów, oprócz tego każ-
dy jej użytkownik może two-
rzyć własne.
którego szkielet przedstawiono na
list. 18
. Plik ten zawiera definicję
klasy pomocniczej o nazwie Ui_frmE-
xample2W, której pola stanowią de-
klaracje poszczególnych widgetów i in-
nych elementów interfejsu graficznego.
Klasa ta jest dziedziczona przez klasę
frmExample2W, umieszczoną w prze-
strzeni nazw Ui. Sposób jej wykorzy-
stania we właściwym pliku nagłów-
kowym formy zdradza
list. 19
. Klasą
formy aplikacji Example2W jest klasa
Example2WFrm, będąca potomkiem
klasy okna dialogowego
QDialog
. Kla-
sa Example2WFrm posiada prywatne
pole o następującej definicji:
Ui::frmExample2W ui;
Dzięki temu, wszystkie elementy
Graficznego Interfejsu Użytkownika,
stworzonego za pomocą programu
QT
Designer
, są po prostu jednym z pól
klasy formy. Można się do nich od-
woływać w ciele tej klasy za pomocą
formuły:
ui.nazwa_elementu_gui
Spójrzmy ponownie na list. 19.
Klasa Example2WFrm posiada dwa
sloty, wymienione w sekcji
private
slots
. Są nimi funkcje, jakie mają
być wywoływane w odpowiedzi
na kliknięcie przycisku
Send
oraz
przepełnienie timera
timerBreakTi-
me
, będącego polem tej klasy. Na
list. 21
przedstawiono konstruktor
klasy Example2WFrm. Jak widać,
w konstruktorze sloty łączone są
z odpowiednimi sygnałami. Ta pro-
sta operacja wystarcza, aby zreali-
zować mechanizm reagowania apli-
kacji na wybrane zdarzenia.
Ciąg dalszy opisu tworzenia apli-
kacji testowej działającej w systemie
Windows przedstawimy w następnej
części kursu.
Arkadiusz Antoniak, EP
arkadiusz.antoniak@ep.com.pl
www.antoniak.ep.com.pl
List. 18. Szkielet pliku źródłowego
ui_Example2WFrm.h, określającego
interfejs graficzny formy
class Ui_frmExample2W
{
//Deklaracje pol i metod klasy
};
namespace Ui {
class frmExample2W: public
Ui_frmExample2W {};
} // namespace Ui
Linki internetowe:
ftp://ftp.trolltech.com/qt/source/
http://www.mingw.org/
http://www.codeblocks.org/
List. 19. Właściwy plik nagłówkowy
formy Example2WFrm.h
#include „ui_Example2WFrm.h”
#include „CommInterface.h”
#include <QtCore/QTimer>
class Example2WFrm : public QDialog
{
Q_OBJECT
public:
Example2WFrm(QDialog *parent = 0);
~Example2WFrm();
private slots:
void timerBreakTimeOverflow(void);
void clickedSendQuery(void);
private:
QTimer *timerBreakTime;
CCommInterface *pComm;
Ui::frmExample2W ui;
};
Rys. 5. Mechanizm sygnałów i slotów
Elektronika Praktyczna 6/2007
91
Plik z chomika:
sq9nip
Inne pliki z tego folderu:
rs232_linux-win32_cz7.pdf
(190 KB)
rs232_linux-win32_cz6.pdf
(799 KB)
rs232_linux-win32_cz5.pdf
(467 KB)
rs232_linux-win32_cz4.pdf
(277 KB)
rs232_linux-win32_cz3.pdf
(392 KB)
Inne foldery tego chomika:
Audio
Eagle
EasyTrax
GPS
Orcad
Zgłoś jeśli
naruszono regulamin