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 :

Comment déterminer la fin d'un message sur le port serie ?


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Comment déterminer la fin d'un message sur le port serie ?
    Bonjour,

    Je suis toujours avec ma communnication RS232 et Cport, je progresse!!

    J'ai de nouveau un petit souci:

    Je recois un simple string. Et j'utilise la fonction: OnRxChar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Procedure TForm1.CportRxChar(sender: Tobject; Count: Integer);
       Begin
          Cport.ReadStr(Str,Count);
          Edit1.text:= Edit1.Text+ Str;
       end;
    La fct lit 8 caractère, les écrits, puis recommence jusqu'au bout du message.

    Ce que je voudrait, c'est savoir comment faire pour connaitre la fin de la lecture du port. Car j'aimerais lancer automatiquement une fonction qui me selectionne qqe caractere dans mon string.

    Comment Faire?

    D'avance merci

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    bjr

    il me semble qu'il existe deux solutions :

    Soit tu contrôles les caractères reçus et dans ce cas ru peux prévoir qu'un carcatère ou un groupe de caractères esr un marqueur de fin

    Soit tu considères (avec un timer) que si tu n'as rien reçu depuis x ms, le message est terminé.

    Frantz

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    frantzgac a tout à fait raison!

    Tu peux aussi envoyer la taille totale en tout 1er, au tout début de la chaîne. Ainsi le programme saura dès le départ combien de caractère il va devoir recevoir. Je procède de cette manière pour la transmission de données sur une interface électronique... Les 8 premiers caractères de la chaîne correspondent à la taille totale des données en héxadécimal (de 00000000 à FFFFFFFF). Le fait d'avoir la taille finale des données te permettra d'ajouter une ProgressBar par exemple...

    frantzgac est prévoyant : L'ajoût d'un TimeOut est indispensable dans ce genre de programme!

    Le code suivant illustre la méthode que j'utilise. La procédure CportRxChar attend d'avoir au moins 8 caractères dans l'Edit pour extraire les 8 caractères qui donneront la taille totale des données. Une fois cette taille obtenue, les caractères reçus ensuite correspondront aux données et s'ajouteront à l'Edit jusqu'à qu'elles atteingnent la taille totale programmée... A chaque reception, la variable du TimeOut est réinitialisée à zéro. Le timer de son côté, incrémente cette variable toutes les secondes jusqu'à que la reception soit terminée ou bien qu'un TimeOut de 10 secondes ait lieu... Ainsi, le TimeOut s'enclenchera uniquement si la communication est bloquée durant 10 secondes consécutives. Malgré tout, ce TimeOut ne bloquera pas la reception pour autant...

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Var
      TimeOut: Integer; // Variable compteur utilisée pour le TimeOut
      Taille: Integer;  // Taille totale des données à réceptionner
     
     
    {----------------------------------------------------------------}
    { Initialisation du programme de réception                       }
    {----------------------------------------------------------------}
    Procedure TForm1.FormCreate(Sender: TObject);
    Begin
      Timer1.Enabled := False;
      Timer1.Interval := 1000;
      TimeOut := 0;
      Taille := 0;
      Edit1.Text := '';
    End;
     
     
    {----------------------------------------------------------------}
    { Réception des données avec taille totale au début              }
    {----------------------------------------------------------------}
    Procedure TForm1.CportRxChar(sender: Tobject; Count: Integer);
    Begin
      Cport.ReadStr(Str, Count);
      Edit1.Text := Edit1.Text + Str;
     
      If (Taille = 0) And (Length(Edit1.Text) >= 8) Then
      Begin {$R-}
        Taille := StrToInt('$' + Copy(Edit1.Text, 1, 8));
        If (Taille <= 0) Then
        Begin
          Label1.Caption := 'Erreur: La chaîne ne respecte pas le protocol!';
          Edit1.Text := '';
          Exit;
        End;
        Edit1.Text := Copy(Edit1.Text, 8 + 1, Length(Edit1.Text) - 8);
      End;
     
      Label1.Caption := IntToStr(Length(Edit1.Text)) + ' / ' + IntToStr(Taille);
     
      If (Length(Edit1.Text) >= Taille) And (Taille > 0) Then
      Begin
        Label1.Caption := Label1.Caption + ' - Réception terminée!';
        Edit1.Text := Copy(Edit1.Text, 1, Taille);
        Timer1.Enabled := False;
        Exit;
      End;
     
      Timer1.Enabled := True;
      TimeOut := 0;
    End;
     
     
    {----------------------------------------------------------------}
    { Timer appellé toutes les secondes - Incrémente le TimeOut      }
    {----------------------------------------------------------------}
    Procedure TForm1.Timer1Timer(Sender: TObject);
    Begin
      If (TimeOut >= 10 - 1) Then
      Begin
        Label1.Caption := Label1.Caption + ' - TimeOut 10 secondes!';
        Timer1.Enabled := False;
      End
      Else
        TimeOut := TimeOut + 1;
    End;
    Pour envoyer les données avec la taille au début, c'est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cport.WriteStr(IntToHex(Length(Edit1.Text), 8) + Edit1.Text);
    ps: Je te conseille fortement d'ajouter un checksum pour contrôler l'intégrité des données reçues. En effet, le port série (trames rs232) est connu pour son manque de fiabilité de transmission, surtout à des fréquences et/ou des distances critiques... Tu devras alors accuser la reception des données avant de continuer à émettre. Je te donnerais l'algoritme que j'utilise si tu es intérressé.

    Cordialement
    De retour parmis vous après 10 ans!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/09/2011, 15h49
  2. Réponses: 3
    Dernier message: 18/11/2009, 01h25
  3. Réponses: 2
    Dernier message: 03/09/2009, 11h57
  4. [Débutant] Comment déterminer la fin d'un fichier?
    Par Greg.shogun dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/03/2007, 20h07

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