Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Nouveau Candidat au Club
    Utilisation de valeurs lues sur le port série (QextSerialPort)
    Bonjour tous le monde,

    Je suis débutant en C++ avec Qt Creator et j'ai entrepris d'utiliser la librairie QextSerialPort pour lire les données de capteurs envoyés sur le port COM. J'arrive bien à obtenir les valeurs sur la console en utilisant la classe PortListener et j'aimerai pouvoir les utiliser pour faire des opération dessus ou les afficher sur une interface. Seulement je ne sais pas comment faire en sorte que la classe me retourne une variable dans le main qui corresponde au valeurs affichées en debug.

    J'imagine qu'il faut que je créer une fonction membre qui prenne une variable et le nom du port en arguments et retourne la variable qui contient les données ? On m'a parlé de la notion de service pour résoudre ce problème mais je n'en connais pas grand chose, peut-être que quelqu'un peut m'éclairer ?

    La classe PortListener ressemble à ça, elle est donnée dans les exemples de la bibliothèque QextSerialPort :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    PortListener:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />ortListener(const QString &portName)
    {
        qDebug() << "hi there";
        this->port = new QextSerialPort(portName, QextSerialPort::EventDriven);
        port->setBaudRate(BAUD9600);
        port->setFlowControl(FLOW_OFF);
        port->setParity(PAR_NONE);
        port->setDataBits(DATA_8);
        port->setStopBits(STOP_2);
     
        if (port->open(QIODevice::ReadWrite) == true) {
            connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
            connect(port, SIGNAL(dsrChanged(bool)), this, SLOT(onDsrChanged(bool)));
            if (!(port->lineStatus() & LS_DSR))
                qDebug() << "warning: device is not turned on";
                qDebug() << "listening for data on" << port->portName();
        }
        else {
            qDebug() << "device failed to open:" << port->errorString();
        }
    }
     
    void PortListener::onReadyRead()
    {
        QByteArray bytes;
        int a = port->bytesAvailable();
        bytes.resize(a);
        port->read(bytes.data(), bytes.size());
        qDebug() << "bytes read:" << bytes.size();
        qDebug() << "bytes:" << bytes;
    }


    Je l'appelle dans le main avec une ligne PortListener listener(portName); Et en message de debug j'ai les valeurs contenues dans "bytes" auxquelles je voudrai accéder dans mon main dans une variable "sensor_value" par exemple. Les valeurs ressemblent à "123.18" ou "25.34"...

  2. #2
    Modérateur

    Bonsoir,

    Tout d'abord quelques remarques :

    • Attention à cette indentation trompeuse :
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      1
      2
      3
              if (!(port->lineStatus() & LS_DSR))
                  qDebug() << "warning: device is not turned on";
                  qDebug() << "listening for data on" << port->portName();

      est équivalent à :
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      1
      2
      3
      4
              if (!(port->lineStatus() & LS_DSR)) {
                  qDebug() << "warning: device is not turned on";
              }
              qDebug() << "listening for data on" << port->portName();
    • open() retourne déjà un booléen => if (port->open(QIODevice::ReadWrite) == true) {
    • Enfin,
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      1
      2
      port->read(bytes.data(), bytes.size());
      qDebug() << "bytes read:" << bytes.size();

      Le nombre d'octets lus n'est pas obligatoirement la taille bytes.size() que tu passes, mais la valeur que retourne la fonction read().

    Afin de faire ce tu souhaites, crée-toi un signal dans ta classe :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class PortListener {
        ...
    signals:
        void valuesAvailable(QByteArray const &);
    };

    connecte-le dans ton main() à la partie que tu souhaites exécuter à la réception :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PortListener listener(portName);
    QObject::connect(&listener, &PortListener::valuesAvailable, [](QByteArray const & sensor_value) {
        // ...
    });

    et émets-le dans ton slot onReadyRead() :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    emit valuesAvailable(bytes);
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

###raw>template_hook.ano_emploi###