Guide pratique de QextSerialPort pour la communication série sous Qt

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 structures QextPortInfo contenant 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.cpp et posix_qextserialport.h.

2. Compilation en bibliothèque dynamique :

  1. Téléchargez et décompressez les sources.
  2. Exécutez qmake pour générer le makefile, puis utilisez make (ou nmake sous Windows) pour compiler.
  3. Dans votre fichier de projet Qt, ajoutez : ``` CONFIG += extserialport // Pour Qt4
  4. Utilisez la bibliothèque dans votre application.

3. Compilation en bibliothèque statique :

  1. Modifiez le fichier qextserialport.pro en ajoutant : ``` CONFIG += qesp_static
  2. Compilez comme pour la bibliothèque dynamique (qmake, make).
  3. 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. Mark n'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 mode QextSerialPort::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;
};

Étiquettes: Qt QextSerialPort Communication Série ports série C++

Publié le 18 juillet à 23h52