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

Lazarus Pascal Discussion :

Composant TSerial : Comment récupérer des données émises par un port série [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Composant TSerial : Comment récupérer des données émises par un port série
    Bonjour,

    Bien qu'ayant consulté l'exemple associé au composant "TLazSerial'', je n'arrive pas à récupérer les données émises par un appareil par l'intermédiaire d'un port série.
    Tout d'abord, par l'utilisation du logiciel CoMPort Data Emulator j'ai vérifié que mon PC recevait bien l’information transmise en continu par l'appareil (une balance). Cette information se présente comme indiqué sur l'image jointe.
    Ce qui m’intéresse c'est de récupérer dans une variable la chaine fde caractères correspondant au poids lu comprise entre le caractère '+' et le caractère'g. soit , dans le cas de l'exemple : 1184.7.

    pour cela , j'écrit une procédure appelée ''Lecture_portSerie" qui, pour le moment contient simplement :
    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
    Procedure TF_Balanc.lecture_portserie;
     
      Var Str_P : String ;       // Chaine de caractère émise par le port série
     
     
     
     
    begin
     
          Laz_serie.Active:= True ;
         // Partie à coder pour récupérer la chaine de caractère Poids_lu (définie comme varaible // // globale) Str_P correspondant à la brqiue de construction de cette chaine dont les étapes //me semblent être :
    	 //parcours du signal reçu en continu du port série 
    	// - reconnaissance du caractère de début de la chaine (le +)
    	// stockage des caractères de type nombre 0 à 9 et du séparateur décimal .
    	// reconnaissance du caractère de fin (g)
    	// identification de la chaine Poids_lu comme la suite des caractères stockés
        Laz_serie.Active:= false ;
     
    end;
    sachant que la procédure lecture_PortSerie est appelée à partir d'une procédure onTimer qui boucle à intervalle réguliers (choisi par l'utiisateur expl 5 minutes) la lecture de l'information ne durant que pendant les 2, 5 ou 10 secondes de la boucle précédente :
    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
    procedure TF_balanc.Tim_lectBalTimer(Sender: TObject);
      // TIMER en route - Exécution des taches à effectuer
      Var Comptrebour : integer ;
    begin
      ED_DatHeur.Text:= DateTimeToStr(Now);
      Tactuel := Now ;
      TDelta := Tactuel- TDepart ;   // calcul du temps écoulé depuis le Start (Jours décimaux)
      Ed_Tecoule.Text := FloatToStr(Tdelta) ; // affichage en jours décimaux du temps écoulé
      // décompte du temps pour le stockage des données
      Sh_TemRouge.Brush.Color := StringToColor('$00FF00') ;  // témoin d'écriture - Couleur Vert
      Comptrebour :=  StrToInt(Ed_Stockage.text) * 60 ;
      DecompteTemp :=  Decomptetemp + 1 ;
      Ed_Compteur.Text := IntToStr(ComptRebour - DecompteTemp) ;
      if StrToInt(Ed_compteur.text) < StrToInt(Ed_Prisinfo.text)  then
         Begin
            Lecture_PortSerie ;   // APPEL A LA LECTURE DES INFOS TRANSMISES ***********
            Sh_TemRouge.Brush.Color := StringToColor('$00FB4DEE')  ; // modification couleur du Témoin de connexion du Timer  (vert--> Fuschia)
         end;
      if decompteTemp = Comptrebour Then
         Begin
           // ZONE DE TRAVAIL SUR LES DONNEES
            Sh_TemRouge.Brush.Color := StringToColor('$00FF00')  ; // modification couleur du Témoin de connexion du Timer  (Fushia--> Vert)
            stockageData   ;
         end;
    end;
    Tout cela est une question de comprehension des infos renvoyées par le ReadData de Laz_Serie et de l'accès à ces infos.

    Qui pourrait m'éclaire la -dessus

    Merci

    R.O.
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    dans l'exemple la réception de données est gérée par événements : A chaque fois qu'on reçoit quelque chose sur le port série, on bufférise jusqu'à ce que une séquence de fin (dans l'exemple CRLF) arrive et on traite alors ce qu'il y a dans le buffer. Pourquoi ce mode ne te convient-il pas ? Si tu utilises un timer on ne peut pas utiliser le mode par événements. Il faut regarder si il y a des données en attente et lire ces données.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    dans l'exemple la réception de données est gérée par événements : A chaque fois qu'on reçoit quelque chose sur le port série, on bufférise jusqu'à ce que une séquence de fin (dans l'exemple CRLF) arrive et on traite alors ce qu'il y a dans le buffer. Pourquoi ce mode ne te convient-il pas ? Si tu utilises un timer on ne peut pas utiliser le mode par événements. Il faut regarder si il y a des données en attente et lire ces données.

    Ami calmant, J.P

    Bonjour et merci beaucoup pour avoir répondu si rapidement,
    En fait, toute solution me convient. Je suis simplement perdu dans la façon d'opérer. J'avais, il y a longtemps, programmé la même chose avec Delphi4 et cela ne m'avait pas posé beaucoup de problèmes. J'avais lu toute la chaine entre 2 Chr$13+Chr$10 et avais ensuite exttrait la valaleur à stocker de la chaine. Je tente, pour mes successeurs au labo, d'adapter au matériel actuel ce que j'avais fait et il ne me manque plus que cette étape.
    Concrètement : comment "bufferiser" dans une chaine de caractères entre deux séquences de fin ?

    Merci

    R.O.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    dans l'exemple il faut regarder la procédure de réception par événement SerialRxData :

    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
    // variables globales définies  au début : 
    // CurPos : integer;
    //  FTempStr: String;   
    procedure TFMain.SerialRxData(Sender: TObject);
    var Str : string;
    begin
      Str :=  Serial.ReadData;
      CurPos := Pos( Char(10) ,Str);
      if CurPos = 0 then begin
        FTempStr := FTempStr + Str;
      end
      else begin
        FTempStr := FTempStr + Copy( Str, 1, CurPos-1);
        Memo.Lines.BeginUpdate;
        Memo.Lines.Add(FtempStr);
         Memo.Lines.EndUpdate;
        Memo.SelStart := Length(Memo.Lines.Text)-1;
        Memo.SelLength:=0;
        AnalyseTrames(FtempStr);
        FTempStr := Copy(Str,CurPos +1, Length(Str) - CurPos);
      end;
     
    end;
    En fait on bufférise ce qu'on reçoit dans FTempStr et lorsqu'on a reçu le caractère de fin (ici 10 -> LF ) on traite ce qu'il y a dans FTempStr (ici dans AnalyseTrames).

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Récupérer les données à partir d'un port série
    Bonjour,

    Merci pour votre réponse.
    Je regarde cela et vais tenter de le mettre en oeuvre dans mon cas.

    Cordialement

    R.O.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut TSerial - récupérer les données
    Bonjour,

    Pour la forme - Voir la discussion "LazSerial - Utiliser les données" créée le 23/07/2017.

    Cordialement

    R.O.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/05/2014, 17h57
  2. comment récupérer des données MATLAB sous delphi
    Par redhammd dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/06/2007, 16h01
  3. Comment récupérer des valeur séparé par ; ?
    Par Nico128 dans le forum Delphi
    Réponses: 12
    Dernier message: 14/01/2007, 12h42
  4. comment récupérer des données sous DOS
    Par ad44dz dans le forum Ordinateurs
    Réponses: 1
    Dernier message: 06/11/2006, 15h29
  5. Comment récupérer des données de Outlook Express ?
    Par frenchsting dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 29/04/2005, 11h07

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