Pour un projet industriel, les étudiants doivent utiliser QT4 et dialoguer avec différents appareils par le port série. QT4 ne délivrant pas nativement de classe gérant le port série, il faut se tourner vers des développements extérieurs. Pour l’instant j’en connais deux:
- QTExtSerialPort : http://code.google.com/p/qextserialport/
- QTSerialDevice : http://gitorious.org/qserialdevice
Mon environnement de développement sera une debian Squeeze. QTCreator est installé depuis les paquets standards (en version 1.3.1 basé sur les librairies QT 4.6.3).
Test avec QExtSerialPort
Il faut se rendre àl’adresse indiquée plus haut. On va faire une copie du projet en utilisant Mercurial. Il faut d’abord installer celui-ci puis se déplacer dans un endroit adéquate puis enfin rapatrier le projet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
olivier@portable-od:~$ sudo aptitude install mercurial olivier@portable-od:~$ cd Documents/BTS_IRIS/LangageC-C++/Qt olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt$ hg clone https://code.google.com/p/qextserialport/ destination directory: qextserialport requesting all changes adding changesets adding manifests adding file changes added 106 changesets with 726 changes to 124 files (+2 heads) updating to branch default 95 files updated, 0 files merged, 0 files removed, 0 files unresolved olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt$ ls basiclayouts imageviewer qextserialport collidingmice localfortuneclient Test_crosscompilateur |
On rentre dans le répertoire « qextserialport ». On remarque un « qextserialport.pro » (un projet Qt4). On va donc essayer de compiler ce projet avec une simple commande « make ». En analysant les messages de compilation, on remarque que l’on a obtenu:
- une librairie partagée : libqextserialport.so.1.2.0 dans le répertoire « src/build » et les liens symboliques
- des exemples : enumerator, event (le projet QEPSTA nécessite une compilation dans QTCreator)
On teste donc les exemples fournis…le problème est que la librairie partagée n’est pas reconnue. Je copie donc celle-ci dans « /lib » et je fais les liens symboliques associés. Enfin on remet à jour la liste des librairies avec ldconfig:
1 2 3 4 5 6 7 8 9 10 11 12 |
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport$ cd src/build/ olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ ls libqextserialport.so libqextserialport.so.1 libqextserialport.so.1.2 libqextserialport.so.1.2.0 olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ sudo cp libqextserialport.so.1.2.0 /lib [sudo] password for olivier: olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/src/build$ cd /lib olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so.1.2 olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so.1 olivier@portable-od:/lib$ sudo ln -s libqextserialport.so.1.2.0 libqextserialport.so olivier@portable-od:/lib$ sudo ldconfig olivier@portable-od:/lib$ cd /home/olivier/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator/ olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator$ |
- enumerator : on lance l’éxecution du programme « enumerator » et l’on obtient la liste des « ports séries » disponible sur la machine.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/enumerator$ ./enumerator List of ports: port name: "ttyS0" friendly name: "Serial port 0" physical name: "/dev/ttyS0" enumerator name: "/dev" vendor ID: "ffffffffa3e49cf8" product ID: "7fff" =================================== port name: "ttyS1" friendly name: "Serial port 1" physical name: "/dev/ttyS1" enumerator name: "/dev" vendor ID: "ffffffffa3e49cf8" product ID: "7fff" =================================== port name: "ttyS2" friendly name: "Serial port 2" physical name: "/dev/ttyS2" enumerator name: "/dev" vendor ID: "ffffffffa3e49cf8" product ID: "7fff" =================================== port name: "ttyS3" friendly name: "Serial port 3" physical name: "/dev/ttyS3" enumerator name: "/dev" vendor ID: "ffffffffa3e49cf8" product ID: "7fff" =================================== port name: "ttyUSB0" friendly name: "USB-serial adapter 0" physical name: "/dev/ttyUSB0" enumerator name: "/dev" vendor ID: "ffffffffa3e49cf8" product ID: "7fff" =================================== |
En fait le seul port série que j’ai sur ma machine est le « /dev/ttyUSB0 » : c’est un adaptateur USB-Serie basé sur le circuit FT232 de FTDI.
- event : si on exécute ce programme, le message d’erreur suivant apparaît :
1 2 3 4 5 6 |
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ./event hi there trying to open file "COM1" could not open file: Aucun fichier ou dossier de ce type device failed to open: "The COM1 file doesn't exists" ^C |
Visiblement le nom du port est codé « en dur ». Donc on modifie le fichier source (remplacement de COM0 par /dev/ttyUSB0) et on recompile (make dans le répertoire) puis on exécute :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ nano main.cpp olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ls event event.pro main.cpp Makefile PortListener.cpp PortListener.h tmp olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ make g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I../../src -Itmp -o tmp/main.o main.cpp main.cpp: In function ‘int main(int, char**)’: main.cpp:15: warning: unused variable ‘listener’ g++ -Wl,-O1 -o event tmp/main.o tmp/PortListener.o tmp/moc_PortListener.o -L../../src/build -L/usr/lib -lqextserialport -lQtGui -lQtCore -lpthread olivier@portable-od:~/Documents/BTS_IRIS/LangageC-C++/Qt/qextserialport/examples/event$ ./event hi there trying to open file "/dev/ttyUSB0" file opened succesfully warning: device is not turned on listening for data on "/dev/ttyUSB0" bytes read: 2 bytes: "f " bytes read: 2 bytes: "f " bytes read: 2 bytes: "x " |
Visiblement le programme fonctionne et reçoit les données de la voie série. Nous avons donc deux codes sources à examiner.
J’ouvre enfin le programme QEPSTA dans QTCreator (ouvrir le projet QEPSTA.pro) et je lance la compilation et l’exécution. A la compilation une erreur apparaît, je modifie la ligne d’include concernée en #include « ../../src/qextserialport.h ». Je relance la compilation est j’obtiens deux erreurs sur fprintf et stderr. Je choisis la solution radicale de commenter les lignes concernées. Il y a d’autres erreurs du mêmes types. Cependant à la fin le programme ne pouvait être lié avec la bibliothèque qextserialportd (voir le fichier qespta.pro, d pour debug). J’ai donc changé en qextserialport et c’est OK. Le programme graphique s’exécute.
J’ai depuis développé une petite application de test basé sur trois « scrool bar » R,G,B pour commander le microcontrolleur. Le tout est fonctionnel. Le code sera mis plus tard avec les classes associées.
Comme nous avons des doutes sur la compilation de cette librairie sous la dernière version de QT (4.8 à l’instant d’écriture de ces lignes) j’installe dans une machine virtuelle VirtualBox une ubuntu 11.10. QTCreator sera alors installé ensuite pour voir quel version est utilisé dans cette environnement. Suivant la version, j’installerai le dernier SDK directement depuis le site de QT.