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 :

[Port série] Réception/envoi de message


Sujet :

Qt

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut [Port série] Réception/envoi de message
    Bonjour tout le monde,

    J'essaye, sans succès, depuis ce matin de faire communiquer deux de mes ports série: le com11 et le com10 que j'ai relié à l'aide d'un cable db9 croisé.

    Malheureusement, j'ai l'impression que les données, qui semblent bien être émises, n'arrivent jamais.

    Voici mon code :


    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
     
    #include <QCoreApplication>
    #include <QtSerialPort/QtSerialPort>
    #include "windows.h"
    #include <iostream>
     
    using namespace std;
     
     
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
    //*****************************************************************************************************************
        //Here I create two serial ports : the first one to emit and the second one to receive
        QSerialPort *SerialEmitter = new QSerialPort;
        QSerialPort *SerialReceiver = new QSerialPort;
     
    //*****************************************************************************************************************
        //Here we initialize serial ports
        SerialEmitter->setPortName("COM11");
        SerialEmitter->setBaudRate(QSerialPort::Baud115200);
        SerialEmitter->setDataBits(QSerialPort::Data8);
        SerialEmitter->setParity(QSerialPort::NoParity);
        SerialEmitter->setStopBits(QSerialPort::OneStop);
        SerialEmitter->setFlowControl(QSerialPort::NoFlowControl);
        SerialEmitter->open(QSerialPort::OpenModeFlag::ReadWrite);
     
    //*****************************************************************************************************************
        //Here I initialize the message i am going to send
        SerialReceiver->setPortName("COM10");
        SerialReceiver->setBaudRate(QSerialPort::Baud115200);
        SerialReceiver->setDataBits(QSerialPort::Data8);
        SerialReceiver->setParity(QSerialPort::NoParity);
        SerialReceiver->setStopBits(QSerialPort::OneStop);
        SerialReceiver->setFlowControl(QSerialPort::NoFlowControl);
        SerialReceiver->open(QSerialPort::OpenModeFlag::ReadWrite);
     
    //*****************************************************************************************************************
        //Here I initialize the message i am going to send
        char * TheMessage= new char[3];
        TheMessage[0]='1';
        TheMessage[1]='2';
        TheMessage[2]='3';
     
    //*****************************************************************************************************************
        //Here I also initialize the buffer to get back "The message"
        char * dataToReceive = new char;
        cout<< "The value retrun of this function is "<< SerialEmitter->write(TheMessage)<<endl;
        Sleep(200);
        cout<< "The value retrun of this function is "<< SerialReceiver->read(dataToReceive,3*sizeof(char))<<endl;
     
    //*****************************************************************************************************************
        cout<<"Here we write what has been received"<<endl;
        for (int i=0; i<5; i++)
        {
            cout<<dataToReceive[i]<<endl;
        }
     
    //*****************************************************************************************************************
        SerialEmitter->close();
        SerialReceiver->close();
     
        return a.exec();
    }

    Voici ce que j'ai dans la console :


    The value retrun of this function is 3
    The value retrun of this function is 0
    Here we write what has been received
    t

    -

    D


    Comme vous pouvez le constater, il n'y a rien dans mon vecteur de retour. Savez-vous à quoi cela est dû?

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 197
    Points : 11 619
    Points
    11 619
    Par défaut
    Salut,
    Est ce que la tableau "TheMessage" ne devrait il pas contenir 4 caractères, c'est à dire '1', '2', '3' et le caractère de fin de chaîne "\0" ? Moi je pense que si !
    Attention à 3*sizeof(char) si tu ajoutes un caractère de plus dans ton tableau.



    Autre question :
    Tu es sur de ne pas créer un débordement ici ??? Comment sais tu que lorsque i = 4 on est toujours dans dataToReceive ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for (int i=0; i<5; i++)
        {
            cout<<dataToReceive[i]<<endl;
        }

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    Salut Vincent!


    Tout d’abord je tiens à te remercier pour ta réponse et pour ta spontanéité,

    Concernant tes remarques, tu as raison, j'ai fait une erreur de recopie, mais même en tenant compte des points que tu as mentionnés, le problème persiste :

    Je change donc :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char * TheMessage = new char[3];
    	TheMessage[0] = '0';
    	TheMessage[1] = '1';
    	TheMessage[2] = '\0';

    et évidemment :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cout << "Here we write what has been received" << endl;
    	for (int i = 0; i<3; i++)
    	{
    		cout << (int)dataToReceive[i] << endl;
    	}

    Mais j'obtiens toujours dans la console :


    The value retrun of this function is 2
    The value retrun of this function is 0
    Here we write what has been received

    ²
    ²

    Il est intéressant de noter la valeur 0, qui est le nombre de byte lus sur le port serialReceiver est 0.

  4. #4
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    re,

    Pour tous ceux qui rencontreront ce problème : tout est dans la temporisation. J'ai donc rajouté une ligne de code. Maintenant tout marche à merveille :

    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
     
    //Here I also initialize the buffer to get back "The message"
        char * dataToReceive= new char[3];
        for(int i=0;i<3;i++)
        {
            cout<< (int) dataToReceive[i]<<endl;
     
        }
        cout<< "The value retrun of this function is "<< SerialEmitter->write(TheMessage)<<endl;
        SerialEmitter->waitForBytesWritten(-1);
        SerialReceiver->waitForReadyRead(100);
        SerialReceiver->read(dataToReceive, 3*sizeof(char));
     
        for(int i=0;i<3;i++)
        {
            cout<< (int) dataToReceive[i]<<endl;
     
        }
     
        SerialEmitter->close();
        SerialReceiver->close();

    La ligne est dont il est question est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SerialReceiver->waitForReadyRead(100);
    Pour info il existe aussi l'instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SerialEmitter->waitForBytesWritten()
    pour attendre que les données soient envoyées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] FTDI Port série réception evenement
    Par abb291 dans le forum wxPython
    Réponses: 3
    Dernier message: 30/03/2016, 19h03
  2. envoi tableau de data sur port série
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2005, 16h23
  3. Réception d'un signal via le port série
    Par vanoou dans le forum C++
    Réponses: 8
    Dernier message: 17/03/2005, 10h43
  4. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04
  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: 19/03/2004, 23h18

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