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 d'affichage de trame et de TimeOuts avec le TComPort


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de vantoff
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut Problème d'affichage de trame et de TimeOuts avec le TComPort
    Bonjour,
    j'ai deux problèmes:
    j'envois une commande a un controleur et lui doit me revoyer une trame.
    Il envoit la trame mais lettre par lettre et en allant à chaque fois à la ligne.Je crois que c'est le TimeOuts du composant TComPort,le buffer doit certainement considere chaque caractère comme une trame dans l'évènement RxChar. Comment faire pour y remedier.
    Mon Code
    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
    void __fastcall TMainForm::ComPort1RxChar(TObject *Sender, int Count)
    {
    //Fonction permettant la réception des trames
     
       char buffer2[255];
       char str[255];
       unsigned char *buf = new unsigned char [Count];
     
    //Lecture des "Count" octet(s) présent(s) dans le buffer d'entrée et le(s) place dans TrameReception
     
       ComPort1->Read(buf,Count);  // STX,CARTE SBI232C V1,ETX
       ComPort1->ClearBuffer (false, true);
     
    //buf[Count] = NULL;
     
       if(Count < 2) return;
     
       if(buf[0] != _STX_)
       {
        Terminal->Items->Add("Début de trame erronée!!!");
       }
       if(buf[Count-1] != _ETX_)
       {
        Terminal->Items->Add("Fin de trame erronée!!!");
       }
       for(int i=0;i<Count;i++)
       {
       memcpy (str,&buf[1],Count-2);
       sprintf ("%s",str);
       LedReception->Enabled=true;
       LedReception->State=lsOn;
       }
       Terminal->Items->Add(str);
       free(buffer2);
    }
    Aussi dans la trame "ETX,Décodeur 232 V.1.0,Cr,STX" je veux juste qu'il m'affiche sur ma ListBox juste "Décodeur 232 V.1.0", il va faloire gerer un pointeur qui va balayer mon buffer je crois.


    Merci de votre aide.

  2. #2
    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,
    comportement étonnant
    petite question ? quelle est la valeur de Count
    si effectivement tu ne reçois dans ton buffer qu'un caractère à la fois
    pourquoi ne pas gérer ceci dans une boucle du style tant que pas <Stx> on ne fait rien, tanst que non <etx> on additionne au buffer le catactpe reçu
    attention dans ton code tu ne libère pas le bon buffer
    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

  3. #3
    Membre confirmé Avatar de vantoff
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Citation Envoyé par DjmSoftware
    bonjour,
    comportement étonnant
    petite question ? quelle est la valeur de Count
    si effectivement tu ne reçois dans ton buffer qu'un caractère à la fois
    pourquoi ne pas gérer ceci dans une boucle du style tant que pas <Stx> on ne fait rien, tanst que non <etx> on additionne au buffer le catactpe reçu
    attention dans ton code tu ne libère pas le bon buffer
    cordialement
    ce dont tu parle je fais là.voici mon code:
    Mais il affiche n'importe quoi et toujour caractère par caractère.
    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
    void __fastcall TMainForm::ComPort1RxChar(TObject *Sender, int Count)
    {
    //Fonction permettant la réception des trames
    
       char buffer2[255];
       char str[255];
       unsigned char *buf = new unsigned char [Count];
    
    //Lecture des "Count" octet(s) présent(s) dans le buffer d'entrée et le(s) place dans TrameReception
    
       ComPort1->Read(buf,Count);  // STX,CARTE SBI232C V1,ETX
       if(Count < 2) return;
    
       if(buf[0] != _STX_)
       {
        Terminal->Items->Add("Début de trame erronée!!!");
       }
       if(buf[Count-1] != _ETX_)
       {
        Terminal->Items->Add("Fin de trame erronée!!!");
       }
       for(int i=1;i<Count-2;i++)
       {
       memcpy (str,&buf[1],Count-2);
       sprintf ("%s",str);
       LedReception->Enabled=true;
       LedReception->State=lsOn;
       }
       Terminal->Items->Add(str);
       ComPort1->ClearBuffer (false, true);
    }

  4. #4
    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
    es tu certain de ta transmissiom
    (Baud Rate, PArité, Bit de Stop)
    je n'ai jamais eu de problèmes avec ce composant

    pour tester tu peux essayer avec Hyperterminal pour contrôler la transmission
    cordialement

    attention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned char *buf = new unsigned char [Count];
    // ce buffer n'est jamais libéré si tu sors normalement de l'évenement RxChar ou via if(Count < 2) return;
    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

  5. #5
    Membre confirmé Avatar de vantoff
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Citation Envoyé par DjmSoftware
    bonjour
    es tu certain de ta transmissiom
    (Baud Rate, PArité, Bit de Stop)
    je n'ai jamais eu de problèmes avec ce composant

    pour tester tu peux essayer avec Hyperterminal pour contrôler la transmission
    cordialement

    attention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned char *buf = new unsigned char [Count];
    // ce buffer n'est jamais libéré si tu sors normalement de l'évenement RxChar ou via if(Count < 2) return;

    je ne gère pas ces protocales(Baud Rate, PArité, Bit de Stop) car je l'ai configurer ainsi.

    je suis sur que c'est un problème de timeouts. Aussi je précise que je travaille à 14400bauds.

  6. #6
    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
    je doute qu'il s'agisse d'un problème de timeouts avec les valeurs par défault de ce composant on peut travailler sans problèmes sans modifier les paramètres de Timeouts jusq'a 38400 Bauds
    si tu recois n'importe quoi il s'agit certainement de paramétrisation de ta connection RS232
    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

  7. #7
    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
    tu peux t'inspirer également des exemples fournis avec ce composant
    ComExampleC6.zip
    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

  8. #8
    Membre confirmé Avatar de vantoff
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Citation Envoyé par DjmSoftware
    bonjour
    tu peux t'inspirer également des exemples fournis avec ce composant
    ComExampleC6.zip
    c'est parfait ton interface reçois parfaitement la trame de mon micro. Pourrai tu me dire alors comment du as implémenter la réception sur le ComPort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TMainForm::ComPort1RxChar(TObject *Sender, int Count)
    {
     ???????????????????????
    }
    Sachant que tu dois afficher les trame sur une ListBox

  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 de l'exemple est ci-dessous
    Sample.zip
    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 confirmé Avatar de vantoff
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Citation Envoyé par DjmSoftware
    bonjour
    le code de l'exemple est ci-dessous
    Sample.zip


    ça fonction si et seulement si j'utilise un Memo. Mais moi j'utilise un ListBox
    j'ai modifier l'évènement suivant
    votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::ComPortRxChar(TObject *Sender, int Count)
    {
      AnsiString Str;
     
      ComPort->ReadStr(Str, Count);
      Memo->Text = Memo->Text + Str;
    }
    Mon code pour une listBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TMainForm::ComPort1RxChar(TObject *Sender, int Count)
    {
    //Fonction permettant la réception des trames
       AnsiString Str;
       ComPort1->ReadStr(Str, Count);
       ListBoxl->Items->Add(Str);
    }
    Mais l'affichage de la trame se fait caractère par caractère.

  11. #11
    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
    bonsoir
    code avec les ListBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TMainForm::ComPort1RxChar(TObject *Sender, int Count)
    {
    //Fonction permettant la réception des trames
       AnsiString Str;
       ComPort1->ReadStr(Str, Count);
       ListBoxl->Items->Text=ListBoxl->Items->Text+Str;
    }
    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

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/08/2014, 12h20
  2. Réponses: 5
    Dernier message: 07/09/2012, 20h07
  3. Réponses: 5
    Dernier message: 15/01/2010, 15h02
  4. Réponses: 2
    Dernier message: 24/02/2009, 12h18
  5. Réponses: 1
    Dernier message: 13/01/2009, 17h24

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