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

C++ Discussion :

Lecture sur le port série


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Lecture sur le port série
    Bonjour,

    Je programme une classe pour gérer le port série mais j'ai un petit problème : ma fonction recevoir n'attend pas les données... Elle me dit tout de suite que le buffer est vide. Est-ce que c'est normal ??

    Les timeouts ne permettent pas de faire "attendre" la fonction ReadFile un certain temps avant de dire que le buffer est vide ??

    Je fais mes test avec un bouchon qui me permet de recevoir les données que j'envoi (il marche, en faisant une pause avant "recevoir" tout marche bien...).


    fonction recevoir :

    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
    1.  // Permet de recevoir des octets sur le liaison série
    2.  int LiaisonSerie::recevoir(void * telBuffer, unsigned int telleTailleBuffer)
    3.  { 
    4.      COMSTAT stat; 
    5.      DWORD errors; 
    6.      unsigned int nbCarALire = 0; 
    7.      unsigned long nbCarLus = 0; 
    8.      int codeRetour = EXIT_SUCCESS;
     
    9.     if(handleCom == NULL) 
    10.    { // si la connexion n'est pas établie
    11.         messageErreur(Err_Connexion);
    12.         return Err_Connexion;
    13.    }  
     
    14.    //Pour connaitre le nombre d'octets dans le buffer d'entrée 
    15.    ClearCommError(handleCom,&errors,&stat); 
    16.    nbCarALire = stat.cbInQue; 
     
    17.    if(nbCarALire<=0)
    18.    { // si le buffer est vide
    19.         messageErreur(Err_Buffer_Vide);
    20.         return Err_Buffer_Vide;
    21.    }
     
    22.    if(nbCarALire <= telleTailleBuffer)
    23.        nbCarALire = telleTailleBuffer;
    24.    else
    25.        codeRetour = Reception_Non_Finie;
     
    26.    //On effectue la lecture si il y a des caractères présents 
    27.    if(ReadFile(handleCom,telBuffer,nbCarALire,&nbCarLus,NULL)==0) 
    28.    { // Echec
    29.        messageErreur(Err_Reception);
    30.        return Err_Reception;
    31.    } 
     
    32.    return codeRetour; // EXIT_SUCCESS si la reception est finie, sinon Reception_Non_Finie
    33.}// recevoir
    Merci pour votre aide

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Salut,

    je ne comprends pas trop ta question, mais je peux déjà te donner quelques remarques issues de mon expérience personnelle:
    * Il n'y a pas necessairement des données sur le port série, même quand tu en attends. Je veux dire que le flux n'est pas forcément constant, où qu ta fonction de lecture va plus vite que le flux, etc. Donc, il faut faire attention à ne pas sortir de la boucle simplement lorsqu'il n'y a rien à lire.
    * Peut-être ton problème vient-il tout simplement du fait que tu veux commencer à lire trop vite, et que le flux n'est pas encore "arrivé".
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Salut,

    en fait je voudrais faire comme par exemple avec les sockets. J'ai programmé un logiciel de p2p en java récemment et lorsqu'on lit sur un socket, même si les données ne sont pas encore arrivées, ca ne dit pas que le buffer est vide et que rien n'est arrivé, on attend que les données arrivent et on continue le programme. Je voudrais faire la même chose avec le port série. Je croyais que les timeouts permettait d'attendre qu'une donnée arrive un certain temps, et une fois le temps écoulé, une erreur était générée. Apparament je dois me tromper. A quoi servent les timeout alors ??
    Je pourrais faire une petite pause avant chaque reception mais je ne peux pas me le permettre. Le périphérique balance plus de 60 000 données, si je faisait une pause entre chaque même de 50ms je perdrais beaucoup de temps. Je voudrais donc recevoir les données dès que possible, comme avec les sockets quoi. Est-ce que c'est possible ??

    J'espère t'avoir éclairé. Si tu as d'autres questions, n'hésites pas.

    Merci pour votre aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Le fonctionnement que tu observes est parfaitement normal.
    Le port série transmet ou reçoit octet par octet.
    Il est donc normal avec cette méthode de recevoir un message vide ou encore pire, un message incomplet!

    Il faut choisir entre 2 méthodes :
    - synchrone où on attend la fin du message avant le retour de la fonction.
    - asynchrone où l'attente se fait dans un autre thread avec envoi de notification de réception au thread principal.

    Tout dépends du protocole de transmission et de l'impact sur le temps de réponse du reste de l'application.
    On ne peut pas faire boire un âne qui n'a pas soif.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Ok, merci.
    Je pense que je vais partir sur le mode asynchrone. Merci pour votre aide.
    A+

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

Discussions similaires

  1. lecture de msg sur le port série
    Par gugpi09 dans le forum Général Python
    Réponses: 2
    Dernier message: 16/12/2013, 13h38
  2. Réponses: 7
    Dernier message: 18/07/2011, 17h34
  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, 12h52
  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, 10h42
  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