Lors du développement d'applications de communication série avec Qt4, plusieurs bibliothèques tierces sont disponibles, notamment QextSerialPort et QtSerialPort. QtSerialPort, bien qu'étant une solution plus récente et officiellement intégrée à Qt5, est moins répandue dans les projets basés sur Qt4. QextSerialPort, quant à elle, est largement utilisée et constitue la base de la communication série dans des logiciels tels que UniSYS2. Cet article propose un aperçu de la bibliothèque QextSerialPort.
QextSerialPort est distribuée sous licence MIT depuis sa version 1.2 beta. Elle est conçue pour offrir une interface aux ports série traditionnels dans les applications Qt, prenant en charge les systèmes d'exploitation Mac OS X, Windows, Linux et FreeBSD.
Structure de la bibliothèque
La bibliothèque QextSerialPort se compose de deux classes principales :
- QextSerialPort : Gère les opérations de communication série, que ce soit sur des plateformes POSIX ou Windows.
- QextSerialEnumerator : Permet de découvrir les ports série disponibles sur le système. Sa méthode
getPorts()renvoie une liste de structuresQextPortInfocontenant des détails sur chaque port.
La classe QextSerialPort est structurée de manière à abstraire les différences entre les plateformes. QextBaseType est une macro utilisée pour différencier les implémentations spécifiques à Windows et POSIX.
Modes d'intégration et d'utilisation
QextSerialPort peut être intégrée à un projet Qt de plusieurs manières :
1. Intégration directe du code source :
Téléchargez le code source et incluez le fichier de projet qextserialport.pro directement dans votre projet. Les fichiers sources nécessaires varient selon la plateforme :
- Windows :
qextserialbase.cpp,qextserialbase.h,qextserialport.cpp,qextserialport.h,win_qextserialport.cpp,win_qextserialport.h. - Linux et autres POSIX : Remplacez les fichiers spécifiques à Windows par
posix_qextserialport.cppetposix_qextserialport.h.
2. Compilation en bibliothèque dynamique :
- Téléchargez et décompressez les sources.
- Exécutez
qmakepour générer lemakefile, puis utilisezmake(ounmakesous Windows) pour compiler. - Dans votre fichier de projet Qt, ajoutez : ```
CONFIG += extserialport // Pour Qt4
- Utilisez la bibliothèque dans votre application.
3. Compilation en bibliothèque statique :
- Modifiez le fichier
qextserialport.proen ajoutant : ``` CONFIG += qesp_static - Compilez comme pour la bibliothèque dynamique (
qmake,make). - Dans votre fichier de projet Qt, ajoutez : ```
CONFIG += extserialport // Pour Qt4
4. Génération de la documentation :
Pour compiler la documentation, exécutez la commande suivante sur les plateformes POSIX :
make docs
Exemples d'utilisation
Utilisation de QextSerialEnumerator :
Cet exemple montre comment lister les ports série disponibles :
#include "qextserialenumerator.h"
#include <QtCore/QList>
#include <QtCore/QDebug>
int main() {
QList<QextPortInfo> ports = QextSerialEnumerator::getPorts();
qDebug() << "Liste des ports disponibles:";
foreach (QextPortInfo info, ports) {
qDebug() << "Nom du port:" << info.portName;
qDebug() << "Nom convivial:" << info.friendName;
qDebug() << "Nom physique:" << info.physName;
qDebug() << "Nom de l'énumérateur:" << info.enumName;
qDebug() << "ID du vendeur:" << info.vendorID;
qDebug() << "ID du produit:" << info.productID;
qDebug() << "===================================";
}
return 0;
}
Utilisation de QextSerialPort :
Le fragment de code suivant illustre la configuration et l'utilisation d'un port série :
// Instanciation du port série (ici, COM4 avec mode EventDriven)
QextSerialPort *serialPort = new QextSerialPort("COM4", QextSerialPort::EventDriven);
// Ouverture du port en lecture/écriture
if (serialPort->open(QIODevice::ReadWrite)) {
// Configuration des paramètres du port
serialPort->setBaudRate(BAUD9600); // Vitesse de transmission
serialPort->setFlowControl(FLOW_OFF); // Contrôle de flux
serialPort->setParity(PAR_NONE); // Parité
serialPort->setDataBits(DATA_8); // Bits de données
serialPort->setStopBits(STOP_1); // Bits d'arrêt
// Écriture de données sur le port
serialPort->write("Bonjour le monde!");
// Les données reçues peuvent être lues ici (en mode EventDriven, via des signaux)
// Fermeture du port
serialPort->close();
} else {
qDebug() << "Erreur lors de l'ouverture du port.";
}
Points importants et limitations
La liste complète des membres de la classe QextSerialPort est disponible ici.
- Ordre des opérations : Les paramètres de configuraton d'un port série ne peuvent être appliqués qu'après son ouverture.
- Modes de fonctionnement : La bibliothèque propose deux modes principaux :
QextSerialPort::Polling: Pour la lecture/écriture asynchrone.QextSerialPort::EventDriven: Pour la lecture/écriture synchrone (basé sur les événements).
- Compatibilité des paramètres : Il existe des différences dans le support des paramètres (comme les vitesses de transmission) entre les plateformes Windows et POSIX.
- Bits de données : Les options sont 5, 6, 7 ou 8 bits. Des restrictions s'appliquent :
- 5 bits de données ne peuvent être utilisés avec 2 bits d'arrêt.
- 1.5 bits d'arrêt ne peuvent être utilisés qu'avec 5 bits de données.
- 8 bits de données ne peuvent être utilisés avec la parité "space" sur les systèmes POSIX.
- Parité : Supporte
Space,Mark,None,Even,Odd.Markn'est disponible que sous Windows. - Bits d'arrêt : Les options sont 1, 1.5, ou 2 bits. Des restrictions s'appliquent :
- 2 bits d'arrêt ne peuvent être utilisés avec 5 bits de données.
- 1.5 bits d'arrêt ne peuvent être utilisés avec 6 bits de données ou plus.
- Les systèmes POSIX ne supportent pas 1.5 bits d'arrêt.
setTimeout(): Cette fonction a un comportement différent sous Windows et POSIX. Elle n'est pas fonctionnelle en modeQextSerialPort::EventDriven.
Une structure PortSettings est disponible pour définir et gérer les paramètres du port :
struct PortSettings {
BaudRateType BaudRate;
DataBitsType DataBits;
ParityType Parity;
StopBitsType StopBits;
FlowType FlowControl;
long Timeout_Millisec;
};