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 :

Lecture du port série incohérente


Sujet :

Qt

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut Lecture du port série incohérente
    Bonjour à tous!

    J'ai réalisé une appli qui permet entre autre de lire des trames qui arrivent sur le port série. Ce sont des trames textes.
    Je me suis servi pour cela de QextSerialPort.

    Après avoir réalisé ceci et vérifié le fonctionnement avec un simulateur série, j'ai évidement voulu tester en vrai avec une connexion série. (Envoi de trames depuis un autre poste avec un cable série croisé)
    Et là bah... Je comprends pas trop.
    Je reçois bien la trame mais en plusieurs fois, il peut parfois manquer des lettres dans mes trames...
    Je me suis dit que j'allais débuguer tranquillement et voir ce qu'il se passait, et c'est ça le soucis...en mode debug, je reçois la trame dans son intégralité sans aucun soucis!

    Mes ports séries sont configurés de manières identiques... Je ne vois pas trop du coup.

    Pour info, j'ai connecté un signal ReadyRead() à un Slot receive() et je me demande si ça ne va pas "trop vite" pour qu'il ait le temps de recevoir toute la trame... Du coup il serait sollicité plusieurs fois.

    Des idées ou je suis condamné à marcher en mode debug ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Ca depend ce que tu appelles le mode Debug. Je suppose que tu parles de "pas à pas" si tu dis que c'est trop rapide. Mais ça métonnerait fortement (les pcs d'aujourd'hui sont des machines de guerre )

    Moi je pense que c'est plutot un probleme de variable non initialisés / réinitialisés. En gros, pense bien à réinitialiser tes variables avant chaque relecture (X = 0, monTableau.clear(), etc).

    Tu peux toujours nous montrer ton slot receive si c'est pas top secret défense.

    Bon courage,

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Merci de ta réponse.

    Tant mieux si ce n'est pas un problème de rapidité
    Il n'y a rien de secret, je me suis inspiré de l'exemple fournit avec la librairie externe :
    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
    void PortListener::receive()
    {
        //Déclaration d'un tableau de caractère d'une taille de 510 car max
        char data[512];
     
        //Initialisation du tableau de char avec des caractères nuls
        data[512]= '\0';
     
        //Récupération de la taille de "data"
        //Stockage de la lecture dans "data"
        //Taille max de la trame = 512
        int bytesRead = port->read(data, 512);
     
        //Seulement dans le cas ou il y'a quelque'chose sur le port
        if (bytesRead!=0){
            out<<"["<<NomSerial<<"]: Reception de donnees"<<endl;
            //Réinitialisation du port
            data[bytesRead] = '\0';
            //Affichage sur la console
            QString ligne;
            //Mise en forme de la trame pour affichage sur un autre équipement
            bytesRead = bytesRead - 2;
            ligne = ligne.fromAscii(data,bytesRead);
            out << ligne << endl;  
    }
    Si tu vois quelque chose...
    Edit: Je parlais effectivement du mode "pas à pas"

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Hmm, y' a des trucs que je ne comprends pas trop. Déjà ton devrait te mettre une erreur, puisque ton tableau ne contient que 512 cases (0->511). Perso, je ferais plus un truc du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while(bytesAvailable ()) 
    	{
    	QByteArray datagram;
    	datagram.resize(bytesAvailable ());
            if(read(datagram.data(), datagram.size())!=-1)
                qDebug()<<"Data read"<<datagram;
            else
                qDebug()<<"Read error";
    	}
    Perso je trouve que le QByteArray est une classe fantastique. Dis moi si ça marche.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Alors pour ceux que ça intéresse...

    Déjà, ne pas se fier aux simulations en local et bien utiliser un câble à un moment ou à un autre!
    Ensuite, je me suis aperçu que la communication série est un peu "aléatoire", je reçois bien toute ma trame mais pas forcément en un seul jet. C'est pour ça qu'elle est coupée, et pas forcément au même endroit tout le temps!
    Vu que je n'ai pas osé à m'attaquer au slot receive(), je fais émettre un signal en fin de slot et je traite le problème en aval : je bufferise ma trame jusqu'à l'arrivée d'un caractère spécial, et enfin je peux afficher.

    G, merci beaucoup pour tes réponses, je vais regarder comment tu fais car ça m'a l'air plus propre. Je re-posterai à l'occasion.
    Là je suis un peu pris par le temps, je dois tester la maquette demain et j'ai encore deux trois choses à regler ...

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

Discussions similaires

  1. Lecture du port série
    Par fngakodj dans le forum C++
    Réponses: 0
    Dernier message: 04/10/2010, 11h28
  2. Lecture sur port série sous Linux
    Par DangerousBowlOfJelly dans le forum C
    Réponses: 6
    Dernier message: 28/03/2008, 17h00
  3. lecture du port série
    Par joooooo dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/04/2007, 00h18
  4. Pb lecture sur port série sous XP SP2
    Par ViveLesQuads dans le forum Delphi
    Réponses: 7
    Dernier message: 09/06/2006, 17h12
  5. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50

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