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