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

Qt Discussion :

Réception avec le port série


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 47
    Points : 18
    Points
    18
    Par défaut Réception avec le port série
    Bonjour à vous,

    je travaille actuellement sur un projet et je dois recevoir des valeurs qu'une autre personne m'enverra via un port série.
    Je suis donc sur la reception, j'aimerais recevoir ces valeurs et les afficher sur les vu-metres que voici en image (nommé RF).

    Avez-vous une idée pour réaliser ceci ? J'avais pensé à QSerialPort mais après je galére à programmer pour les recevoirs (.cpp)
    Merci
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Qu'est-ce qui vous pose problème exactement ?
    QSerialPort devrait faire l'affaire, pouvez-vous nous montrer comment vous l'utilisez ?

    Voici un petit exemple d'utilisation simplifié:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
     
     
    //widget.h
    //----------------------------------
    class Widget : public QWidget
    {
        Q_OBJECT
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget(){}
        static QString errorString(QSerialPort::SerialPortError error) const;
        //...
    private:    
        QSerialPort m_serialPort;
        QByteArray m_readData;
        //...
     
     
    private slots:
        //Réception et traitement des données reçues sur le port série
        void handleReadyRead();
        //Gestion des erreurs du port série
        void handleError(QSerialPort::SerialPortError error);
        //...
    }
     
    //widget.cpp
    //----------------------------------
    Widget::Wdiget(QWidget *parent)
        : QWidget(parent)
    {
     
        //initialisation GUI
        //...
     
        //Configuration du port série
        m_serialPort.setPortName("COM1");
        m_serialPort.setBaudRate(QSerialPort::Baud9600);
        //Connection au signal readyRead() afin d'être notifié lors de la réception de nouvelle données sur le port série.
        connect(&m_serialPort, &QSerialPort::readyRead, this, &Widget::handleReadyRead);
        //Connection au signal errorOccurred() afin d'être notifié lorsqu'une erreur survient sur le port série. 
        connect(&m_serialPort, &QSerialPort::errorOccurred, this, &Widget::handleError);
     
        //Ouverture du port. En cas d'erreur, le slot handleError() sera appelé avec le code erreur. 
        m_serialPort.open(QSerialPort::ReadWrite);
    }
     
    void Widget::handleReadyRead()
    {
        //Traitement des données, supposant que chaque valeur est codée en ASCII
        //et séparée par un retour à la ligne. 
        //  Exemple: "10\n12\n14\n"
     
        //Récupération de toutes les données reçues. 
        m_readData.append(m_serialPort->readAll());
        //Détection de retour à la ligne.     
        int pos = m_readData.indexOf("\n");
        //récupération et conversion des valeurs disponibles
        while(pos > 0){
            bool ok = false;
            //Récupération de la valeur codée en ASCII
            double value = m_readData.left(pos - 1).toDouble(&ok);
            //int value = m_readData.left(pos - 1).toInt(&ok);
            //On enlève les données traitées du buffer principal
            m_readData = m_readData.mid(pos);
     
            if(ok){ 
                //Converion réussie !
                //Affichage de la nouvelle valeurs sur la jauge (VU-mètre)
                //Il est peut être inutile d'afficher chaque valeur. On pourrait 
                //n'afficher que la dernière valeur reçue lorsque plusieurs valeurs
                //sont disponibles dans le buffer.
                m_vuMetre->setValue(value);
            } else {
                //Erreur de conversion
                displayError(QString("Error, cannot convert value %1").arg(value));               
            }
        }   
    }
     
    void Widget::handleError(QSerialPort::SerialPortError serialPortError)
    {
        displayError(errorString(serialPortError));
    }
     
    QString Widget::errorString(QSerialPort::SerialPortError serialPortError) const
    {
        switch(serialPortError){
            case QSerialPort::NoError: return "No error occurred.";
            case QSerialPort::DeviceNotFoundError: return "An error occurred while attempting to open an non-existing device.";
            case QSerialPort::PermissionError: return "An error occurred while attempting to open an already opened device by another process or a user not having enough permission and credentials to open.";
            case QSerialPort::OpenError: return "An error occurred while attempting to open an already opened device in this object.";
            case QSerialPort::ParityError: return "Parity error detected by the hardware while reading data. This value is obsolete. We strongly advise against using it in new code.";
            case QSerialPort::FramingError: return "Framing error detected by the hardware while reading data. This value is obsolete. We strongly advise against using it in new code.";
            case QSerialPort::BreakConditionError: return "Break condition detected by the hardware on the input line. This value is obsolete. We strongly advise against using it in new code.";
            case QSerialPort::WriteError: return "An I/O error occurred while writing the data.";
            case QSerialPort::ReadError: return "An I/O error occurred while reading the data.";
            case QSerialPort::ResourceError: return "An I/O error occurred when a resource becomes unavailable, e.g. when the device is unexpectedly removed from the system.";
            case QSerialPort::UnsupportedOperationError: return "The requested device operation is not supported or prohibited by the running operating system.";
            case QSerialPort::TimeoutError: return "A timeout error occurred.";
            case QSerialPort::NotOpenError: return "This error occurs when an operation is executed that can only be successfully performed if the device is open.";
            default:
            case QSerialPort::UnknownError: return "An unidentified error occurred.";
     
        }
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 47
    Points : 18
    Points
    18
    Par défaut
    D'accord merci de l'info mais dois-je mettre "ui->" devant chaque fonction ?
    J'ai créé ce vu-metre depuis l'interface graphique (.ui)

    Pour commencer je dois recevoir moi même des valeurs aléatoires avec Qt Creator et GtkTerm pour voir si le programme fonctionne bien,
    si tout vas bien, mon collègue m'enverra ses valeurs.

    desole du temps de reponse

Discussions similaires

  1. Communiquer avec un port série en java
    Par jlassiramzy dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2006, 18h50
  2. [C#]Problème avec le port série sous Win98
    Par Polux63 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/09/2006, 09h14
  3. Réponses: 7
    Dernier message: 09/06/2006, 10h38
  4. 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: 19/03/2004, 23h18
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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