Communication via le port Série avec Qt, le module QSerialPort :

Estimated read time 4 min read

A partir du Qt5, le Module Qt Serial Port a été ajouté afin de gérer la communication par le biais du bus RS232, Le module fournit un ensemble de fonctionnalité de base, qui comprend la configuration, les opérations d’E / S, l’obtention et le paramétrage des signaux de contrôle des broches RS-232.

Pour utiliser ce module dans vos projets, il faudra d’abord modifier le fichier .pro en ajoutant la ligne suivante :

QT += serialport

Pour utiliser le port série dans votre application, ajoutez l’instruction d’inclusion suivante :

#include <QSerialPort>

Et si vous désirez obtenir plus d’informations sur les ports série disponibles, utilisez l’instruction suivante:

#include <QSerialPortInfo>

La librairie QSerialPortInfo permet d’obtenir des informations sur les ports série disponibles sur votre PC, pour cela Utilisez les fonctions statiques pour générer une liste d’objets QSerialPortInfo. Chaque objet QSerialPortInfo de la liste représente un seul port série. Cet objet contiendra le nom du port, l’emplacement du système, la description du matériel connecté et le fabricant. La classe QSerialPortInfo peut également être utilisée pour paramétrer la méthode setPort () de la classe QSerialPort.

Cette classe est très utile pour obtenir le nom correct du port série que vous souhaitez utiliser dans vos programmes. 

Les fonctions utiles pour récupérer configurer le port USB (RS232) :

QList <QSerialPortInfo> QSerialPortInfo :: availablePorts ()

Renvoie une liste des ports série disponibles sur le système.

QString QSerialPortInfo :: description () const

Renvoie sou forme de chaîne de caractère (de type QString) la description du port série, si disponible ; sinon renvoie une chaîne vide.

QString QSerialPortInfo :: fabricant () const

Renvoie sou forme de chaîne de caractère (de type QString) le nom du fabricant du port série, si disponible ; sinon renvoie une chaîne vide.

[static]QList<qint32> QSerialPortInfo::standardBaudRates()

Renvoie une liste des débits en bauds standard disponibles pris en charge par la plate-forme cible.

les configurations possibles sont illustrées dans le tableau suivant :

ConstantÉvaluerDescription
QSerialPort::Data55Le nombre de bits de données dans chaque caractère est de 5. Il est utilisé pour le code Baudot. Cela n’a généralement de sens qu’avec des équipements plus anciens tels que les téléimprimeurs.
QSerialPort::Data66Le nombre de bits de données dans chaque caractère est de 6. Il est rarement utilisé.
QSerialPort::Data77Le nombre de bits de données dans chaque caractère est de 7. Il est utilisé pour le vrai ASCII. Cela n’a généralement de sens qu’avec des équipements plus anciens tels que les téléimprimeurs.
QSerialPort::Data88Le nombre de bits de données dans chaque caractère est de 8. Il est utilisé pour la plupart des types de données, car cette taille correspond à la taille d’un octet. Il est presque universellement utilisé dans les nouvelles applications.
QSerialPort::UnknownDataBits-1Nombre de bits inconnu. Cette valeur est obsolète. Il est fourni pour que l’ancien code source fonctionne. Nous vous déconseillons fortement de l’utiliser dans un nouveau code.
  • setStopBits() : choisir le nombre de bits d’arrêt à utiliser
ConstantÉvaluerDescription
QSerialPort::OneStop11 bit d’arrêt.
QSerialPort::OneAndHalfStop31,5 bits d’arrêt. Ceci est uniquement pour la plate-forme Windows.
QSerialPort::TwoStop22 bits d’arrêt.
QSerialPort::UnknownStopBits-1Nombre inconnu de bits d’arrêt. Cette valeur est obsolète. Il est fourni pour que l’ancien code source fonctionne. Nous vous déconseillons fortement de l’utiliser dans un nouveau code.

Et pour les opération de lecture et d’écriture, on utilisera par exemple les méthodes read() et write().

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>



int main()
{
    QList<QSerialPortInfo> listePorts;
    QStringList listePortsDisponibles;
    QSerialPort *port;

    
    listePorts = QSerialPortInfo::availablePorts();
    for (int i=0; i < listePorts.size();i++)
    {
        QSerialPortInfo info = listePorts.at(i);
        if(!info.manufacturer().isEmpty())
            listePortsDisponibles << info.manufacturer() + " (" + info.portName() + ")";
        else
            listePortsDisponibles << info.portName();
        
    }
    // instanciation du port
    port = new QSerialPort(listePorts.at(0).portName());
    
    // TODO : paramètrer le port (débit, ...)
    port->setBaudRate(BAUD9600);
    port->setDataBits(DATA_8);
    port->setParity(PAR_NONE);
    port->setStopBits(STOP_1);
    port->setFlowControl(FLOW_OFF);
    
    // ouverture du port
    port->open(QIODevice::ReadWrite);
    qDebug("<debug> etat ouverture port : %d", port->isOpen());
    
    // TODO : réceptionner et/ou envoyer des données
    QByteArray data = port->readAll();
    qDebug() << "message recu :" << data;
    // fermeture du port
    port->close();
    qDebug("<debug> etat ouverture port : %d", port->isOpen());
    
    delete port;
    
    return 0;
}

You May Also Like

More From Author

+ There are no comments

Add yours