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++Builder Discussion :

Problème de lecture de trame sur port COM !


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut Problème de lecture de trame sur port COM !
    Bonjour à tous,

    Voici mon soucis : j'ai une fonction de lecture du port com (celui-ci est bien détecté), il y a bien des infos qui circule sur le port mais cela ne vient pas dans mon appli !!!

    Je vous post le code de lecture :
    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
     
    ErrCom Com::LectureCom (void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
    {
     
    	COMSTAT Stat;
    	DWORD Errors;
    	unsigned int nCarALire;
    	NCarLus = 0;
     
    	if(hdl!=NULL)
    	{
    		//on pari sur pas d'erreur
    		EtatCom = ErrCom_None;
     
    		//Pour éviter de gérer un time out
    		//Sleep((unsigned long)500);
     
    		int TimeoutRead=500;
    		timeouts.ReadIntervalTimeout=MAXWORD;
    		timeouts.ReadTotalTimeoutMultiplier=0;
    		timeouts.ReadTotalTimeoutConstant=TimeoutRead;
    		timeouts.WriteTotalTimeoutMultiplier=0;
    		timeouts.WriteTotalTimeoutConstant=0;
     
     
    		//Pour connaitre le nombre d'octets dans le buffer d'entrée
    		ClearCommError(hdl,&Errors,&Stat);
    		nCarALire=Stat.cbInQue;
     
    		//On effectue la lecture si il y a des caractères présents
    		if( (nCarALire>0)&&(nCarALire<=nCountMax) )
    		{
    			if(ReadFile(hdl,lpBuf,nCarALire,&NCarLus,NULL)==0)
    			{
    				EtatCom = ErrCom_Reception;
    			}
     
    		}
    		*pCountRead=NCarLus;
    	}
    	else
    		//Le port n a pas été ouvert
    		EtatCom = ErrCom_Creation;
     
    	//Compte rendu de l'exécution
    	return EtatCom;
     
     
    }
    et voici l'appe de la fonction située dans un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do
    		{
    			Nblu = laCom.NCarLus;
    			laCom.LectureCom(buf,sizeof(buf), &Nblu);
    		}
    		while (Nblu!=18);
    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    J'ai pas le temps de trop regarder ton code en détail, mais tu pourrais aller le site Web suivant: http://maikel.galeon.com/serie/bcbcomm.html

    Sinon tu peux toujours utiliser le composant TComPort: http://trote.developpez.com/tutoriel...ear-rad-studio

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour Crayon et merci d'avoir répondu.

    Pour mieux comprendre, je post mon fichier qui gère la Com série :
    UCom.cpp

    UCom.h

    et je fais appel aux fonctions de ce fichier dans un thread :
    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
     
            Com laCom;
     
    	AnsiString COM = laCom.InitCom();
    	laCom.ConnectCom(COM.c_str(),38400,8,0,1);
     
     
    	while (Suspended == false)
    	{
     
    		do
    		{
     
    			laCom.LectureCom(buf,sizeof(buf), &Nblu);
    		}
    		while (Nblu!=18);
    J'ai testé avec un "sniffer" de port et il y a bien des infos qui arrivent du port, cependant je n'ai rien qui vient sur mon appli : le programme n'arrête pas de boucler au niveau de la lecture !!!

  4. #4
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Un petit conseil rapide, tu devrais regarder en premier lieu si cette commande fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	laCom.ConnectCom(COM.c_str(),38400,8,0,1);
    Si la valeur de retour est ErrCom_None, alors tu peux aller dans le while.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour,

    J'ai vérifié la valeur de retour de cette fonction et j'ai bien "ErrCom_None" !!!

    Je pense vraiment que le problème vient de ma boucle while et/ou de ma fonction de lecture.

    Vraiment là je suis à court d'idées, je ne sais pas comment résoudre ce problème.


  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		//On effectue la lecture si il y a des caractères présents
    		if( (nCarALire>0)&&(nCarALire<=nCountMax) )
    		{
    			if(ReadFile(hdl,lpBuf,nCarALire,&NCarLus,NULL)==0)
    			{
    				EtatCom = ErrCom_Reception;
    			}
     
    		}
    Question: Que vaut nCountMax ?? Et que se passe-t'il s'il y a plus de nCountMax octets dans le buffer du port COM ?

Discussions similaires

  1. Problème de lecture de données sur le port USB
    Par lujacquet1 dans le forum C
    Réponses: 3
    Dernier message: 08/06/2015, 15h56
  2. Réponses: 0
    Dernier message: 26/09/2012, 16h49
  3. Problème de lecture sur port COM
    Par Marthym dans le forum MFC
    Réponses: 10
    Dernier message: 11/04/2006, 15h36
  4. Write puis read sur port com
    Par chourmo dans le forum API, COM et SDKs
    Réponses: 34
    Dernier message: 21/06/2005, 17h36
  5. Problème de reception sur Port COM
    Par Revan777 dans le forum C
    Réponses: 9
    Dernier message: 19/04/2005, 21h55

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