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 avec TComPort


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Par d�faut Probl�me avec TComPort
    Bonjour,
    Je voudrais commencer en pr�cisant que j�ai commenc� � d�velopper avec C++ builder il y a une semaine.

    J'utilise C++ Builder pour cr�er un hyperterminal sp�cifique � une application.

    Une carte �lectronique munie d'un microcontroleur est reli�e � mon PC via une liaison RS232.
    Tout fonctionne avec l'hyperterminal de windows, mais les fonctions d'enregistrement et le nombre de ligne sont limit�s, c'est pourquoi j'essaie de d�velopper cette nouvelle application.

    Pour la liaison s�rie j'utilise le composant TComPort avec les carateristique suivante :
    vitesse 115200
    8 bits de donn�es
    1 bit de stop
    pas de parit�
    pas de controle de flux

    J'affiche dans un TRichEdit les octets recu, et j'envoie sur le port COM les touches qui sont appuy�es dans le TRichEdit.

    Des caract�res non-printable me permette de d�terminer le d�but d'une s�quence � enregistrer et la fin.

    Quand une s�quence se termine, je l'enregistre dans un fichier avec la fonction suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    RichEdit2->Lines->SaveToFile(rep_et_nom_fichier);

    Voila mon probl�me :
    Le programme fonctionne tr�s bien mais il arrive un moment ou il reste fig�, je n�ai plus la possibilit� de d�placer la fen�tre, de la dimensionn�, ou de cliquez sur des boutons, mais l�application tourne toujours en tache de fond puisqu�elle m�morise toujours les s�quences.
    Je n�arrive pas � cibler le probl�me, peu etre est-ce une histoire de m�moire qu�il faudrait lib�r�, je ne sais pas, je me r�p�te en disant que c�est ma premi�re application c++ builder donc il est fort possible que j�ais omit des choses.

    Merci 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
    Salut, peut-�tre que la solution serais d'utiliser un thread pour la communication. De cette mani�re, l'interface ne g�le pas lorsque que la communication re�ois ou envoie des donn�es.

    Je ne connais pas TComPort, donc il y a peut-�tre de meilleur solution.

  3. #3
    Membre �m�rite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    916
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 916
    Par d�faut
    Salut,
    Cela ressemble aux symptome d'une boucle infinie.
    Tu peux mettre des points d'arr�t pour savoir o� se trouve ton pointeur d'ex�cution pendant qu'il plante, cela pourra t'aider � cibler le probl�me.

    Tu clic dans la colonne de gauche ou tu appuie sur F5 pour placer un point d'arr�t.

  4. #4
    Membre habitu�
    Inscrit en
    Septembre 2006
    Messages
    11
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Par d�faut
    J'utilise pas mal le TcomPort et je suis d'avis aussi que le thread est la meilleure m�thode pour la com, �a �vite (si tu �cris bien ton code !) ce genre de plantage.

    Sinon il �xiste le logiciel Tera Term (�quivalent � hyperTerminal), mais moins bugg� !

    le lien :
    http://hp.vector.co.jp/authors/VA002416/teraterm.html

    bon courage

  5. #5
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    si lors de l'�criture sur le disque des donn�es affich�es dans ton RichEdit, tu r�ceptionne des donn�es sur le port s�rielle cela peut cr�er des conflits.

    Utilise un objet de type TStream dans le quel tu sauvera les donn�es re�ues et qui par exemple selon un d�lai d�termin� sauve son contenu dans un fichier

    cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Par d�faut
    rol72> comment qu'on fait pour utilis� une thread avec le composant TComPort?

    DjmSoftware> le truck c'est que la tramme que je m�morique est encadr� par des caract�res (non-printable) de d�but et de fin de trame, et que entre, il y a un texte qui est format�, avec des couleurs des tabulations etc, la seul solution que j'ai trouv� c'est d'utilis� le composant TRichtEdit. Quand je recois mon caract�re de d�but de trame j'�fface le contenu de mon composant, apr�s j'affiche tous les caract�res dedans, et quand je recois mon caract�re de fin de trame, je m�morise le contenu de mon composant avec :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    RichEdit2->Lines->SaveToFile(rep_et_nom_fichier);
    donc je recois rien sur le port com pendant que je m�morise sur le disque ....


    Merci pour votre aide!

  7. #7
    Membre habitu�
    Inscrit en
    Septembre 2006
    Messages
    11
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Par d�faut
    Voila comment je fais pour g�rer le port com � partir d'un thread :

    le code du thread est le suivant (fichier -> nouveau -> objet 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
    17
    18
    19
    20
    21
    22
    23
     
    void __fastcall TComProcess::Execute()
    {
        while(!Terminated)
        {
            if ( MainForm->ComPort->Connected )
            {
                    Synchronize(Form1->Reception);
            }
            Sleep(5); // évite de prendre 100% des ressources du processeur ...
        }
    }
     
    et voila la fonction de réception :
     
    void __fastcall TForm1::Reception()
    {
            if ( ComPort->Connected )
           {
                NbOctetsLus = ComPort->Read(Buffer,1);
                RichEdit->Lines->Add(IntToStr(Buffer));
           }
    }
    L'avantage avec un thread est que tu dissocies la partie �v�nementiel de ton programme avec la partie de communication qui s'effectue en t�che de fond.
    La fonction synchronise permet d'�viter les probl�mes de conflit, car quand le thread utilise la ressource RichEdit l'�v�nementiel ne peut pas y acc�der, elle attend que le thread lib�re la ressource (et inversement) !

    Bon courage.

  8. #8
    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
    rol72 n'oublie pas de d'utiliser la balise code quand tu affiches du code, c'est plus facile � lire.

  9. #9
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Bonjour,
    le code avec le thread donn� plus haut n'a gu�re d'utilit� si ce n'est que l'on lit toutes les 5 ms sur le Port s�rielle.
    le composant TComport travaille d�ja avec des thread
    il suffit d'utiliser l'�venement onRxChar

    exemple
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::ComPortRxChar(TObject *Sender, int Count)
    {
      AnsiString Str;
     
      ComPort->ReadStr(Str, Count);
      // tu peux ajouter ici un traitement spécifique
     
      Memo->Text = Memo->Text + Str;
    }
    //---------------------------------------------------------------------------
    Remplace le composant Memo par ton RichEdit

    pour l'�criture dans le port Com
    PE
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    void __fastcall TForm1::Button_SendClick(TObject *Sender)
    {
      AnsiString Str;
     
      Str = Edit_Data->Text;
      if (NewLine_CB->Checked)
        Str = Str + "\r\n";
      ComPort->WriteStr(Str);
    }
    tu peux facilement modifier le code ci-dessus pour l'adapter a tes besoins

    Cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Par d�faut
    D�sol� d'avoir mis autant de temps pour r�pondre mais j'�tait sur d'autres affaires.

    J'ai trouv� une erreur dans mes lignes de code qui, il me semble, �tait la cose de mes soussis!!

    Ancien code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
            AnsiString  car;
            char x;
     
            for(x=0;x<Count;x++)
            {
                    ComPort1->ReadStr(car, 1);
     
    ...

    Nouveau code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
            AnsiString  car;
            int x;
     
            for(x=0;x<Count;x++)
            {
                    ComPort1->ReadStr(car, 1);
     
    ...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. probl�me avec tcomport
    Par habar84 dans le forum C++Builder
    R�ponses: 7
    Dernier message: 27/02/2008, 09h25
  2. probl�me avec TComport
    Par lili81 dans le forum C++Builder
    R�ponses: 3
    Dernier message: 23/11/2007, 07h58
  3. Probl�me avec TComPort
    Par bridy224 dans le forum C++Builder
    R�ponses: 1
    Dernier message: 16/05/2007, 19h17
  4. Probl�me avec TComPort
    Par mesmin.sefelec dans le forum C++Builder
    R�ponses: 3
    Dernier message: 25/01/2006, 15h35
  5. TComPort, probl�me avec RxOnChar
    Par davinout dans le forum Composants VCL
    R�ponses: 5
    Dernier message: 03/06/2005, 08h25

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