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

Discussion :

Communication série avec QtSerialPort

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Par défaut Communication série avec QtSerialPort
    Bonjour
    Je voudrais établir une communication série, pour ceci j'ai utilisé la bibliothèque QtSerialPort http://qt-project.org/wiki/QtSerialPort, je me suis basé sur l'exemple sur le site.

    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
    #include <QtCore/QCoreApplication>
    #include <QtCore/QDebug>
     
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
     
    #include <iostream>
     
    QT_USE_NAMESPACE
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
     
        const QSerialPortInfo info("ttyUSB0");
            qDebug() << "Name        : " << info.portName();
            qDebug() << "Description : " << info.description();
            qDebug() << "Manufacturer: " << info.manufacturer();
     
     
            QSerialPort serial;
            serial.setPort(info);
            if (serial.open(QIODevice::ReadWrite))
            {
     
                serial.setBaudRate(QSerialPort::Baud57600);
                serial.setDataBits(QSerialPort::Data8);
                serial.setParity(QSerialPort::NoParity);
                serial.setStopBits(QSerialPort::OneStop);
                serial.setDataBits(QSerialPort::Data8);
     
                while(1)
                {
                    int j=0;
                    qDebug()<<"Please enter an integer value: ";
                    std::cin>>j;
                    qDebug()<<"j= "<< j << endl;
                    switch(j)
                    {
     
                        case 0:
                        {
                            qDebug() << "ON" << endl;
                            const char *message = "\x4F\x6E\x0A\n";
                            serial.write(message);
                            break;
                        }
     
                        case 1:
                        {
                            qDebug() << "OFF" << endl;
                            const char *message =  "\x4F\x66\x0A\n";
                            serial.write(message);
                            break;
                        }
     
                        case 2:
                        {
                            qDebug() << "R --" << endl;
                            const char *message =  "\x46\x2D\x0A\n";
                            serial.write(message);
                            break;
                        }
     
                        case 3:
                        {
                            qDebug() << "R ++" << endl;
                            const char *message =  "\x46\x2B\x0A\n";
                            serial.write(message);
                            break;
                        }
     
                        default:
                        {
                            qDebug() << "ON" << endl;
                            break;
                        }
                    }
                }
            }
            else
            {
                serial.close();
                qDebug() << "error " <<endl;
            }
     
        return a.exec();
    }
    Malheureusement, quand j'ai testé ce code tous les "qDebug" sont exécutés ainsi les "cin", mais les messages ne sont pas envoyés sur le port série.

    Pour savoir la source du probleme, j'ai testé ce programme:

    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
    #include <QtCore/QCoreApplication>
    #include <QtCore/QDebug>
     
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
     
    #include <iostream>
     
    QT_USE_NAMESPACE
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
     
        const QSerialPortInfo info("ttyUSB0");
            qDebug() << "Name        : " << info.portName();
            qDebug() << "Description : " << info.description();
            qDebug() << "Manufacturer: " << info.manufacturer();
     
     
            QSerialPort serial;
            serial.setPort(info);
            if (serial.open(QIODevice::ReadWrite))
            {
                const char *message1 = "\x46\x2D\x0A\n";
     
                serial.setBaudRate(QSerialPort::Baud57600);
                serial.setDataBits(QSerialPort::Data8);
                serial.setParity(QSerialPort::NoParity);
                serial.setStopBits(QSerialPort::OneStop);
                serial.setDataBits(QSerialPort::Data8);
     
                serial.write(message1);  //1
                int j=0;
                qDebug()<<"Please enter an integer value: ";
                std::cin>>j;
                serial.write(message1);  //2
     
            }
            else
            {
                serial.close();
                qDebug() << "error " <<endl;
            }
     
        return a.exec();
    }
    là je me suis rendu compte que malgré que je demande l'envoie d'un message avant que je mets la valeur demande dans le cin, ce dernier n'est envoyé qu'à la fin du programme, du coup le message s'envoie 2 fois à la suite. Ce qui explique sur le programme précédent pourquoi aucun message n'est envoyé, car ils attendent tous la fin du programme, ce qui n'est jamais réalisé puisqu'il y a une boucle infini.

    A votre avis, que puis-je faire pour éviter ce problème?
    Merci d'avance pour votre aide.

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Par défaut
    Bonjour
    En rajoutant serial.flush() après le message envoyé, le problème est résolu. Mais sur les exemples de la bibliothèque, ils n'utilisent pas cette fonction, je n'arrive pas à comprendre comment leurs programmes fonctionnent.

    Maintenant j'ai du mal à recevoir les messages, voici différents code que j'ai essayés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      QByteArray inByteArray = serial.readAll();
     
        qDebug() << inByteArray;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!serial.bytesAvailables());
     
      QByteArray inByteArray = serial.readAll();
     
        qDebug() << inByteArray;
    Pour chaque message envoyé de mon pc, je dois recevoir une réponse

    Merci d'avance de m'indiquer comment résoudre ce problème.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/04/2014, 20h01
  2. Communication des [ports série] avec [Delphi] 7 sous Windows
    Par mizouz dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 05/05/2013, 08h29
  3. Interface graphique avec communication série
    Par nader_bhs dans le forum Interfaces Graphiques en Java
    Réponses: 9
    Dernier message: 19/04/2013, 19h14
  4. communication série via rs232 avec vb.net
    Par lemabs dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/11/2009, 16h35
  5. Problèmes avec la communication série
    Par rzayani dans le forum Windows
    Réponses: 3
    Dernier message: 18/06/2007, 11h57

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