IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Plateformes Discussion :

Utilisation de valeurs lues sur le port série (QextSerialPort)


Sujet :

Plateformes

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2018
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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::PortListener(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
    Invité
    Invité(e)
    Par défaut
    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);

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2015, 10h14
  2. Réponses: 0
    Dernier message: 29/09/2014, 20h59
  3. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 13h52
  4. Quel langage choisir pour lire sur le port série ?
    Par Nico76 dans le forum Windows
    Réponses: 7
    Dernier message: 28/04/2004, 11h42
  5. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 20/03/2004, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo