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

Composants VCL Delphi Discussion :

Affichage incomplet après réception d'une trame via RS232


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Affichage incomplet après réception d'une trame via RS232
    Bonjour à tous,

    Je suis actuellement entrain d'effectuer mon stage de fin d'étude.

    J'utilise delphi pour receptionner des trames venant d'une balance via le composant TComPort (c'est une balance de haute précision, les trames sont envoyées très rapidement)

    Les trames que je dois recevoir on un format bien spécifique et n'on pas d'entête de début ni de fin. (à savoir : exemple : US,GS,+0039,98 g)

    Losrque je les affiche dans mon Memo, les trames ne sont pas affichées en entier... (Du genre(en reprenant l'exemple du haut: US,GS,+ et le reste est manquant)) Comment puis-je faire pour les receptionner en entier ?

    Voici la partie du code pour la reception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    begin
     
         i:= pos('US',Trame) or pos('ST',Trame);
         ComPort1.ReadStr(Trame,20);
         RxTrame.Text:= copy(Trame,i,20);
     
    end;
    Suis-je assez clair dans mes explications?

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Et en utilisant un TComDataPacket lié au TComport avec la propriété Size à la bonne valeur. (Les trames ont l'air d'être de longueur fixe).

  3. #3
    Futur Membre du Club
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    oui les trames sont de longueur fixes.

    Mais lorsque que j'utilise le ComDataPacket plus rien ne s'affiche.

    Je l'ai peut-etre mal configuré? (Je suis assez débutant en Delphi)

    Les trames commencent soit par 'US' ou 'ST' et se termine soit par 'g' ou 'ozt' ou 'ct'.

    Par contre lorsque j'utilise le ComTerminal, les trames s'affichent bien mais je pense qu'il n'est pas possible de les récupérer via ce terminal (pas de ComTerminal.Text par exemple)

    Merci de m'aider...

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Bonjour,
    Lorsque tu récupère le buffer, il n'est pas garantie que tu ais
    tout tes caractères et tu ne peux donc pas écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ComPort1.ReadStr(Trame,20);
    La fonction ComPort1RxChar(Sender: TObject; Count: Integer);
    t'envois le paramètre Count qui te permet de savoir le nombre de caratères
    disponible. Utilise alors un composant intermédiaire pour ramasser les
    caractères reçu. Ici j'ai utilisé un TRichEdit.
    Voilà ce que je te propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure Tform1.ComPortRxChar(Sender: TObject; Count: Integer);
    var
    	TempStr:string;
    begin
      //== Recuperation des caractères reçus
      ComPort.ReadStr(TempStr, Count);
      //== accumulation des caratères reçu
      RichEdit1.text:=RichEdit1.text+(TempStr);
      //== Traitement ==
      Traitement();
    end;
    La fonction Traitement peux ressembler à ceci:
    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
     
    procedure Tform1.Traitement();
    var
      Start:integer;
      Stop:integer;
      DonneeValide:string;
      BonneTrame:string;
    begin
      //== on cherche
      //==  US,GS,+0039,98 g
     
      //Debut par 'US' ou 'ST'
      repeat
        Start:= max(pos('US',RichEdit1.text) , pos('ST',RichEdit1.text));
        //Fin par 'g' ou 'ozt' ou 'ct
        Stop:=max(Pos('g',RichEdit1.text),Pos('ozt',RichEdit1.text));
        Stop:=max(Pos('ct',RichEdit1.text),Stop);
        if (Start=0) or (Stop=0) then
        begin
          //== On ne trouve aucun debut ou aucune fin alors on sort
          //== immediatement de la boucle
          break;
        end;
        //== Validation ==
        if Start>Stop then
        begin
          //== On a une fin de trame mais il manque le debut ===
          //== le buffer contient donc quelque chose comme:
          //== +0039,98 g US,GS,+0039,98 g
          //== on elimine donc  le debut ==
          RichEdit1.text:=Copy(RichEdit1.text,Start,Length(RichEdit1.text))
        end
        else
        begin
          //== ici une donnée est surment valide ==
          BonneTrame:=Copy( RichEdit1.text,Start,Stop-Start);
          //== Enleve le texte traité
          RichEdit1.text:=Copy(RichEdit1.text,Stop+1,Length(RichEdit1.text))
          //== TODO: faudrait faire quelque chose avec? ==
        end;
      until false; //== Boucle infini, la sortie via le break! ==
    end;
    Bon c'est à tester tout ca mais ca devrait faire la job.

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

Discussions similaires

  1. envoi d'une trame via rs232 avec SOH CR LF
    Par tibjedi dans le forum C
    Réponses: 4
    Dernier message: 24/04/2013, 14h06
  2. Envoi d'une trame via liaison série
    Par Fabien50 dans le forum C++
    Réponses: 48
    Dernier message: 29/04/2009, 09h59
  3. [AJAX] Mise à jour d'une page après réception d'une requête
    Par M.Dlb dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/11/2006, 15h48
  4. Affichage d'images tapant sur une URL via XSL
    Par Tikate dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 28/04/2006, 14h07

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