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

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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 chevronné
    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
    Points : 2 189
    Points
    2 189
    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
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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 chevronné
    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
    Points : 2 189
    Points
    2 189
    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.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    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 confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    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 ?

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

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

    nCountmax vaut 18 car la trame qui arrive sur mon port COM a toujours 18 octets.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Et, du coup, que vaut nCarALire ??

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Oui, c'est vrai "nCarALire" dans le coup vaut aussi 18 !!!

    A vrai dire je suis un peu perdu !!!

    J'ai voulu en fait mettre dans une unité tout ce qui concerne la communication avec le port COM au lieu de mettre tout à la suite dans mon thread.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Marrant (enfin, façon de parler...), j'ai essayé ton code chez moi (UCom.cpp, sans utiliser la fonction InitCom ), et j'arrive à lire avec...



    Là, je n'ai pas d'idées...

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Aîe, et bien moi non plus, je suis désespéré !!!

    Voila maintenant plus d'une semaine que je planche dessus et rien !!!


  12. #12
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    tu dis que tu appelles tes fonctions à partir d'un thread, mais il ne faut pas oublier que tout n'est pas autorisé dans le code d'un thread. Dailleurs, lors de la création d'un thread, l'IDE Borland ajoute systématiquement ce petit commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //---------------------------------------------------------------------------
    //   Important : les méthodes et les propriétés des objets dans la VCL ne peuvent
    //   être utilisées que dans une méthode appelée en utilisant Synchronize, par exemple :
    //
    //      Synchronize(UpdateCaption);
    //
    //   où UpdateCaption pourrait être du type :
    //
    //      void __fastcall MonThread::UpdateCaption()
    //      {
    //        Form1->Caption = "Mise à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
    D'après ce que j'ai lu dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ShowMessage ("Base de collecte connectée sur le port " + COM);
    --> Créer une fonction à part et l'appeler par la méthode "Synchronize()", ou supprimer dans un premier temps pour faire tes essais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			COM = AnsiString(szPortName);
    Les "AnsiString" sont des objets VCL et NE DOIVENT PAS ETRE UTILISES DANS UN THREAD. J'en ai fait l'expérience. A remplacer par une chaine de caractères :
    Pour te simplifier les choses, tu pourrais tester ton code à partir d'une fiche et non pas à partir d'un thread.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Bonjour et merci Luc84 pour ton aide !

    Le soucis vient je pense de la fonction de lecture : j'ai une autre application qui faisait la même chose que je veux faire maintenant sauf qu'avant toutes les fonctions d'ouverture, de lecture, ... du port COM étaient mises à la suite dans un thread.
    Maintenant, en ayant mis ces fonctions à part dans une unité, je n'ai plus rien.
    Le point flou est que lorsque je lance mon ancienne application (ça détecte...), que je la referme et que j'ouvre ma nouvelle après ça fonctionne !!!!!!!

    C'est à ne plus rien n'y comprendre !




  14. #14
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    je n'ai pas tout compris !
    Décris précisément "l'ancienne application" et la "nouvelle".
    Le soucis vient je pense de la fonction de lecture : j'ai une autre application qui faisait la même chose que je veux faire maintenant sauf qu'avant toutes les fonctions d'ouverture, de lecture, ... du port COM étaient mises à la suite dans un thread.
    Maintenant, en ayant mis ces fonctions à part dans une unité, je n'ai plus rien.
    L'important n'est pas l'endroit où sont écrites ces fonctions, mais plutôt, à partir de quel module elles sont appelées.
    Si elles sont appelées à partir de la fonction "Execute()" d'un thread, alors il faut respecter les restrictions que j'ai cité dans mon message précédent.
    Maintenant, en ayant mis ces fonctions à part dans une unité, je n'ai plus rien.
    Qu'est-ce que ça veut dire? "Je n'ai plus rien qui marche" ou "Je n'ai plus de problème"?
    Le point flou est que lorsque je lance mon ancienne application (ça détecte...), que je la referme et que j'ouvre ma nouvelle après ça fonctionne !!!!!!!
    Qu'est-ce que ça veut dire "ça détecte..."?
    Si la "nouvelle" fonctionne après avoir lancé "l'ancienne application", c'est que "l'ancienne application" initialise quelque chose que ne fait pas la nouvelle.
    Mais une fois de plus, teste tes fonctions dans une fiche, pas dans un thread.
    Une fois que les fonctions sont ok, appelle les à partir d'un thread en respectant les restrictions.

  15. #15
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 905
    Points : 2 129
    Points
    2 129
    Par défaut
    Avec ton code, si nCountMax vaut 18, cela veut dire que si tu as plus de 18 octets d'arrivés dans le port COM, tu ne passe pas par la fonction de lecture et tu vas boucler infiniment. ça peut durer longtemps !

    Le mieux dans ce genre de lecture est de lire sur le port com octet par octet, de concaténer les octets reçus dans un buffer et de traiter ce dernier à chaque arrivée d'une nouvelle donnée pour voir s'il a la bonne taille ou contient le bon type de trame (avec la bonne syntaxe etc...). Dans un buffer circulaire de 18 octet dans ton cas.
    Mais ça va dépendre beaucoup de l'appareil branché sur le port com. Par exmple certaines balances à l'allumage vont envoyer des infos d'identification sur le port com. avec ta boucle de lecture de 18 octets pas plus pas moins, tu bouclerais à l'infini car tu aurais ... 10 octets d'identification + 18 de tes trames de donénes =28. ta boucle ne fonctionne plus.

    sans compter qu'au moment ou tu vide le port com avant de l'ouvrir et le lire, qui te dis qu'il n'était pas en milieu de réception de trame.
    regarde ta boucle :
    admettons, tu vide les buffers et tu ouvre le port com en milieu de trame => après ton vidage, le périphérique va envoyer les 9 octets restants de la trame qu'il venait d'envoyer. ta boucle attends 18 octects donc, elle ne lit pas. puis le périph envoie une nouvelle trame => +18 = 27 octet. ta boucle ne lit pas car > 18 et voila, tu boucle à l'infini.
    la aussi ça va dépendre du périph, certains n'enverrons rien tant que ton port n'est pas ouvert mais ça va dépendre de comment il est paramétré (notamment au niveau du controle de flux, j'ai deja eu le probleme).

    bref, je te conseille de revoir sérieusement ton algo de lecture et surtout de donner plus de renseignement si tu veux obtenir une aide plus ciblée car là, ce n'est pas évident. on ne sait rien de la config du périph, des trames qu'il envoie, s'il en envoi continuellement etc...(ni le code complet de ta boucle de thread et du code qui le créé/détruit).

    Nirgal76

    nb: tu peux utiliser des objets VCL dans un thread si tu ne les appelle pas dans le contexte d'un autre thread (le principal par exemple). Dans ce dernier cas, il faut de la synchro mais si tout se passe dans le meme contexte, aucune synchro n'est nécessaire (ni meme souhaitable, ça peut amener à des blocages si c'est fait n'importe comment).

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

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

    merci encore pour votre aide.
    Alors pour ce qui est de mon code, l'unité gérant la com :
    UCom.cpp

    UCom.h

    Mon thread :
    UThread.h
    UThread.cpp

    L'application qui marchait avant avec tout inclus dans mon thread :
    Thread1.zip

    Pour les 2 applis, le module branché en usb au pc envoi régulièrement 18 octets (8 bits de données, pas de parité et 1 de stop).

    Pour ce qui est de la lecture et je pense que le problème vient de cette fonction, j'ai beau y regarder mais je n'y comprend plus rien ... blasé !



    Merci d'avance pour votre aide, à bientôt !

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

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

    suite à mon problème, je n'ai toujours pas trouvé de solution et je suis toujours bloqué !

    Est ce que quelqu'un aurait une idée de codage car là je ne sais vraiment plus.

    Merci et à bientôt !

  18. #18
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 905
    Points : 2 129
    Points
    2 129
    Par défaut
    Bonjour,

    Aie aie aie...Ce genre de code dans un thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FormClient->ChartPH->View3D = false;
    FormClient->ChartConductivite->View3D = false;
    FormClient->ChartTemperature->View3D = false;
    est à proscrire ABSOLUMENT. Il ne faut pas modifier des objets de l'interface graphique depuis un thread sans synchronisation. et ça revient à plusieurs endroits.
    Il te faut revoir toute l'architecture de ton application là.
    Car que ce soit les manques de synchro dans le thread ou la façon de lire sur le port com (lecture qui va boucler à l'infini s'il y a plus de 20 caractères dans le buffer du port com), c'est un peu la cata :/

    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
     
    ErrCom Com::LectureCom (void *lpBuf,unsigned int nCountMax, unsigned int *pCountRead)
    {
    	COMSTAT Stat;
    	DWORD Errors;
    	unsigned int nCarALire;
    	unsigned long NCarLus;
     
    	if(hdl!=NULL)
    	{
    		//on pari sur pas d'erreur
    		EtatCom=ErrCom_None;
     
    		//Pour éviter de gérer un time out
    		Sleep((unsigned long)500);
     
    		//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,sizeof(lpBuf),&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;
     
    }
    Là, problème car si nCarALire est > à nCountMax (20), (par exemple, 2 trames de 18 sont passées donc il y a 36 octets dans le buffer) tu ne passe pas dans le ReadFile, mais ! tu fait qd meme l'affectation
    *pCountRead=NCarLus.
    Hors, NCarLus n'a pas été initialisé dans ce cas précis. En mode debug, il contient 0 surement, mais en mode release c'est au petit bonheur la chance.

    Et s'il contient effectivement 0, en revenant dans le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do
    		{
     
    			laCom.LectureCom(buf,sizeof(buf), &Nblu);
    		}
    		while (Nblu!=18);
    comme nblu sera = à 0, ça va boucler. et comme le buffer de comm va continuer à se remplir (au pire, rester comme il est donc >20), et bien ça va boucler comme ça à l'infini.

    En résumé, La com, conçue comme elle est, elle peut boucler à l'infini et bloquer l'application.
    Les erreurs de synchro vont provoquer des exceptions et/ou des fuites mémoires et autres décalages dans tous les sens niveau mémoire.

    Faut tout repenser de A à Z là, j'suis désolé :/. Et surtout revoir l'utilisation des thread en VCL avant de te replonger dans le code.

    Nirgal76


    edit: ta version précédente "tout dans le thread" ne comportait pas cette boucle infini donc ça marchait. Mais les accès à l'interface graphique depuis le thread y était nombreux donc pas bon du tout quand meme.
    Ca peut marcher si le thread principal n'accède pas aux objets en meme temps. Mais si c'était le cas ou alors dans un contexte où ton thread de com serait lancé plusieurs fois en parallèle, ce serait à coup sur l'exception.

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Ok, merci Nirgal76,

    pour ce qui est de la modification des objets de l'interface graphique OK : je change cela, j'ai bien compris.

    Par contre le gros point dur est la fonction de lecture de mes trames !!!

    C'est là vraiment que j'ai besoin d'aide pour le codage !

  20. #20
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 905
    Points : 2 129
    Points
    2 129
    Par défaut
    Citation Envoyé par petitclem Voir le message
    Ok, merci Nirgal76,

    pour ce qui est de la modification des objets de l'interface graphique OK : je change cela, j'ai bien compris.

    Par contre le gros point dur est la fonction de lecture de mes trames !!!

    C'est là vraiment que j'ai besoin d'aide pour le codage !
    ben déjà, dans la ligne
    if( (nCarALire>0)&&(nCarALire<=nCountMax) )
    de la fonction de lectureCom, je ne vois pas l'utilité de tester nCarALire<=nCountMax car meme si c'est plus grand, tu ne demande qu'a lire sizeof(buf) caractères.
    !! et en plus, sizeof(lpBuf) va te retourner 4 et non pas 20, ça va te retourner la taille du pointeur, pas la taille du buffer alloué (tiens, je me demande si ton erreur vient pas de la d'ailleurs). car si tu ne demande qu'a lire 4 octets, t'aura jamais 18 de lu et donc, bouclage à l'infini.

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		//On effectue la lecture si il y a des caractères présents
    		if( (nCarALire>0)&&(nCarALire<=nCountMax) )
    		{
    			if(ReadFile(hdl,lpBuf,sizeof(lpBuf),&NCarLus,NULL)==0)
    			{
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		//On effectue la lecture si il y a des caractères présents
    		if(nCarALire>0)
    		{
    			if(ReadFile(hdl,lpBuf,nCountMax,&NCarLus,NULL)==0)
    			{
    pour voir


    edit:

    et surtout aussi :
    unsigned long NCarLus=0;

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