Copie de ligne d'un memo vers un autre memo [Résolu]

marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 3 sept. 2013 à 09:12 - Dernière réponse : sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention
- 5 sept. 2013 à 16:27
Bonjour, je cherche à copier certaines lignes d'un memo (memoRecept) vers un autre memo (memoLog)
Voici ce que j'obtiens avec ce code :

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var mess : string;
N : integer;
begin
comport1.ReadStr(mess,count);
memorecept.Lines.Text:= memoRecept.Lines.Text + mess;
memoLog.Lines.BeginUpdate;
For N := 0 to memoRecept.Lines.Count - 1 do
Begin
mess := Uppercase (memoRecept.Lines[N]);
if (pos(' ALM ',mess)+ pos(' ACK ',mess)+ pos(' RTN ',mess)) <> 0 then
if memoLog.Lines.IndexOf(mess) = - 1 then
memoLog.Lines.Add(mess);

end;
// finally
memoLog.lines.EndUpdate;

end;

Dans le memoRecept :
30 Ao- 2013 07:14:07 ALM DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES ON

30 Ao- 2013 07:14:10 ACK DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES ON

30 Ao- 2013 07:16:29 RTN LO 2-03-3-03 PRESSION EM REFRIG AUX 0.8

dans le memoLog :
30 AO- 2013 07:14:07 ALM DISC 1
30 AO- 2013 07:14:07 ALM DISC 1-02-4-22 INDIS
30 AO- 2013 07:14:07 ALM DISC 1-02-4-22 INDISPONIBILITE
30 AO- 2013 07:14:07 ALM DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPE
30 AO- 2013 07:14:07 ALM DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES ON
30 AO- 2013 07:14:10 ACK D
30 AO- 2013 07:14:10 ACK DISC 1-02-4-22
30 AO- 2013 07:14:10 ACK DISC 1-02-4-22 INDISPONIBILIT
30 AO- 2013 07:14:10 ACK DISC 1-02-4-22 INDISPONIBILITE REPRISE
30 AO- 2013 07:14:10 ACK DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES
30 AO- 2013 07:14:10 ACK DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES ON
30 AO- 2013 07:16:29 RTN LO 2-03-
30 AO- 2013 07:16:29 RTN LO 2-03-3-03 PRESSION
30 AO- 2013 07:16:29 RTN LO 2-03-3-03 PRESSION EM
30 AO- 2013 07:16:29 RTN LO 2-03-3-03 PRESSION EM REFRIG AUX
30 AO- 2013 07:16:29 RTN LO 2-03-3-03 PRESSION EM REFRIG AUX 0.8



Merci de votre aide
Afficher la suite 

Votre réponse

34 réponses

sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - Modifié par ichiriac le 3/09/2013 à 18:00
0
Merci
Salut,

Essaie ça :

...
Private
 MonMessage : String;
end;


procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var 
 mess       : string; // Message en capitales pour analyse
 NouveauMsg : string; // Nouvelles données lues
begin
 // Lecture flux comport
 comport1.ReadStr(NouveauMsg, Count);
 MonMessage := MonMessage + NouveauMsg;
 // Si on détecte une fin de ligne dans la ligne en cours de rédaction
 if pos(#13#10, MonMessage) <> 0 then begin
  // Ajout dans le memo d'infos de réception
  memorecept.Lines.Add(MonMessage);
  mess := Uppercase(MonMessage);
  // Recherche des informations à épingler dans le memolog (pas besoin à priori de repasser toutes les
  // lignes du memorecept...)
  if (pos(' ALM ', mess) + pos(' ACK ', mess) + pos(' RTN ', mess)) <> 0 then begin
   // Ajout dans memolog
   if memoLog.Lines.IndexOf(mess) = - 1 
    then memoLog.Lines.Add(mess);
  end;
  // Réinitialisation suite à fin de ligne
  MonMessage := '';
 end;
 Application.ProcessMessages;
end; 
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 17:22
0
Merci
Merci pour ton aide.

Voici ce que j'obtiens avec ton code modifier.
comport1.ReadStr(NouveauMsg,count); //Lecture flux comport
MonMessage := MonMessage + NouveauMsg;
memoRecept.Lines.Text:= memoRecept.Lines.Text + NouveauMsg;
// **Si on détecte une fin de ligne dans la ligne en cours de rédaction **
If pos (#13, MonMessage) <> 0 then
begin
// ** Ajout dans le memo d'infos de réception **
// memoRecept.Lines.Add(MonMessage);
mess := Uppercase(MonMessage);
// ** Recherche des informations à épingler dans le memoLog **
If (pos(' ALM ', mess) + pos(' ACK ',mess) + pos(' RTN ',mess)) <> 0 then
Begin
//** Ajout dans memoLog **
If memoLog.Lines.IndexOf(mess) = -1
then memoLog.Lines.Add(mess);
end;
// ** Réinitialisation suite à fin de ligne **
MonMessage := '';
end;

Dans memoRecept:
31 Ao- 2013 04:44:29 ALM DISC 1-02-1-14 REPRISE EN SECOURS PPES ALIM COMB. DA ON

31 Ao- 2013 04:48:23 ACK DISC 1-02-1-14 REPRISE EN SECOURS PPES ALIM COMB. DA ON

31 Ao- 2013 04:50:05 EVT LGC INH 1-02-2-18 LANCEMENT MP BD SANS VIRAGE LENT ON

31 Ao- 2013 05:01:37 ALM DISC 2-06-2-17 DEFAUT INTERRING ON

31 Ao- 2013 05:01:46 ACK DISC 2-06-2-17 DEFAUT INTERRING ON

31 Ao- 2013 05:03:58 RTN DISC 2-06-2-17 DEFAUT INTERRING ON

31 Ao- 2013 06:41:40 EVT LGC INH 1-02-2-05 LANCEMENT MP TD SANS VIRAGE LENT OFF
31 Ao- 2013 06:41:40 EVT LGC INH 1-02-2-18 LANCEMENT MP BD SANS VIRAGE LENT OFF
31 Ao- 2013 06:49:23 EVT LGC INH 1-05-1-15 (EC 40) P.B. HUILE GRAISSAGE MP BD ON

31 Ao- 2013 06:49:23 EVT LGC INH 1-05-1-16 (EC 40) P.B. ED HT MP BD ON

Dans memoLog :
31 AO- 2013 04:44:29 ALM DISC 1-02-1-14 REPRISE EN SECOURS PPES ALIM COMB. DA ON

31 AO- 20
13 04:48:23 ACK DISC 1-02-1-14 REPRISE EN SECOURS PPES ALIM COMB. DA ON

31 A
5:01:37 ALM DISC 2-06-2-17 DEFAUT INTERRING ON

31 AO- 2
013 05:01:46 ACK DISC 2-06-2-17 DEFAUT INTERRING ON

31
AO- 2013 05:03:58 RTN DISC 2-06-2-17 DEFAUT INTERRING ON

31 AO- 2013

Il ne recopie pas les lignes avec retour à la ligne, mais l'une derrière l'autre. J'ai tenté quelques modif de code et propriétés du mumo mais rien à fairee pour le moment...
Qu'en pense tu?

Le marin

Répondre
simonpelloquin > marin1617 - 3 sept. 2013 à 17:03
Avec plaisir, mais... Postes ça dans le topic que tu as lancé. Si quelqu'un a une meilleure idée, une correction à apporter, peut être que ça peut être quelqu'un d'autre que moi...
Et utilises les balises de codes s'il te plait, c'est plus lisible et facile à comprendre, surtout en fin de journée...
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 17:24
0
Merci
J'aurais aimé savoir ce que donne mon code avant tes modifications... Ce n'est pas du tout le même code, tu as déplacé l'insertion dans le memorecept et tu testes sur #13 au lieu de #10#13.

Peux tu tester mon code et donner le résultat des deux memos (en expliquant bien les anomalies) ?
Commenter la réponse de sp40
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 3 sept. 2013 à 18:09
0
Merci
Excuse, je débute avec codes sources
Commenter la réponse de marin1617
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 11:05
0
Merci
Idée :
Modifie ton tout premier code comme ceci, en ajoutant un MemoInt sur ta form :
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var 
	mess       : string; // Message en capitales pour analyse
	NouveauMsg : string; // Nouvelles données lues
	msgInt     : string;
	i          : integer;
begin
	// Lecture flux comport
	comport1.ReadStr(NouveauMsg, Count);
	msgInt := '';
	For i := 1 to NouveauMsg 
		do msgInt := msgInt +'/'+ IntToStr(Ord(NouveauMsg[i]));
	MemoInt.Lines.Text := MemoInt.Lines.Text + msgInt;
	...



Fais tourner le programme le temps d'avoir 4 ou 5 lignes dans ton memoRecept et poste ici le contenu du memoInt.
On va voir quels sont les caractères qui arrivent au comport.
Commenter la réponse de sp40
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 11:38
0
Merci
Salut,
question : c'est quoi la fin de la trame de réception du port com ?
CR,LF...en gros quand ton port com a fini d'envoyer la ligne il doit te donner une fin de transmission, donc c'est quoi la fin de la ligne ?
D'où une adaptation du code avec un repeat et un until et ensuite la copie dans le mémo...
--
Commenter la réponse de cs_yanb
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 11:46
0
Merci
oui, mais j'ai l'impression que ça arrive trop vite pour la procedure... (le traitement n'est pas fini alors qu'arrivent d'autres caractères...)
Commenter la réponse de sp40
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 12:01
0
Merci
Bonjour, comme ceci
<procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var
mess : string; // Message en capitales pour analyse
NouveauMsg : string; // Nouvelles données lues
msgInt : string;
i : integer;
begin
// Lecture flux comport
comport1.ReadStr(NouveauMsg, Count);
msgInt := '';
For i := 1 to NouveauMsg
do msgInt := msgInt +'/'+ IntToStr(Ord(NouveauMsg[i]));
MemoInt.Lines.Text := MemoInt.Lines.Text + msgInt;
MonMessage := MonMessage + NouveauMsg;
// Si on détecte une fin de ligne dans la ligne en cours de rédaction
if pos(#13#10, MonMessage) <> 0 then begin
// Ajout dans le memo d'infos de réception
memorecept.Lines.Add(MonMessage);
mess := Uppercase(MonMessage);
// Recherche des informations à épingler dans le memolog (pas besoin à priori de repasser toutes les
// lignes du memorecept...)
if (pos(' ALM ', mess) + pos(' ACK ', mess) + pos(' RTN ', mess)) <> 0 then begin
// Ajout dans memolog
if memoLog.Lines.IndexOf(mess) = - 1
then memoLog.Lines.Add(mess);
end;
// Réinitialisation suite à fin de ligne
MonMessage := '';
end;
Application.ProcessMessages;
end;
>
mais il me donne une erreur "[Error] Unit1.pas(110): Incompatible types: 'Integer' and 'String' " avec le curseur clignatant entre "do" et "msgInt".
Si j'ajoute strtoint avant "NouveauMsg", une erreur fatale arrive dès que j'envoi des données sur le port com ?
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 12:06
Pardon, milles excuses...

For i := 1 to length(NouveauMsg)
		do msgInt := msgInt +'/'+ IntToStr(Ord(NouveauMsg[i]));

Commenter la réponse de marin1617
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 12:02
0
Merci
Deuxième question : Est-ce que c'est une réception permanente ou une réception après demande sur le port com ?
Après peu importe si le traitement arrive avec d'autres caractères il faut faire le tri dans la trame qui arrive et connaitre les caractères de fin de trame.
Mon idée est la suivante dans une réception permanente quand on trouve les caractères de fin bidon on les remplace par #13#10 de façon à faire un saut de ligne sur le mémo et ensuite utilisé la fin de trame si elle est compatible à notre filtre...
--
Commenter la réponse de cs_yanb
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 12:11
0
Merci
Je copie mon code entre < et > mais je ne vois pas de différence?
Comment fais tu pour mettre de la couleur, numéroter tes lignes de codes etc...
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 12:24
tu sélectionnes ton code et tu cliques sur le bouton <> en haut ;-)
Commenter la réponse de marin1617
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 5 sept. 2013 à 13:48
0
Merci
J'avais pas vu que tu avais ouvert deux discussions !

Cette lecture peut te donner une piste
http://nono40.developpez.com/tutoriel/delphi/2005/comport/

A+

Jderf

--
Commenter la réponse de jderf
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 14:27
0
Merci
Avec ce code,
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var
 mess       : string; // Message en capitales pour analyse
 NouveauMsg : string; // Nouvelles données lues
 msgInt     : string;
 i          : integer;
begin
 // Lecture flux comport
 comport1.ReadStr(NouveauMsg, Count);
 memoRecept.Lines.Text := memoRecept.Lines.Text + NouveauMsg;
 	msgInt := '';
  For i := 1 to length(NouveauMsg)
		do msgInt := msgInt +'/'+ IntToStr(Ord(NouveauMsg[i]));
	MemoInt.Lines.Text := MemoInt.Lines.Text + msgInt;
 MonMessage := MonMessage + NouveauMsg;
 // Si on détecte une fin de ligne dans la ligne en cours de rédaction
 if pos(#13#10, MonMessage) <> 0 then begin
  // Ajout dans le memo d'infos de réception
  memorecept.Lines.Add(MonMessage);
  mess := Uppercase(MonMessage);
  // Recherche des informations à épingler dans le memolog (pas besoin à priori de repasser toutes les
  // lignes du memorecept...)
  if (pos(' ALM ', mess) + pos(' ACK ', mess) + pos(' RTN ', mess)) <> 0 then begin
   // Ajout dans memolog
   if memoLog.Lines.IndexOf(mess) = - 1
    then memoLog.Lines.Add(mess);
  end;
  // Réinitialisation suite à fin de ligne
  MonMessage := '';
 end;
 Application.ProcessMessages;
end;


Voici ce que jobtiens dans le memoRecept:
01 Sep 2013 08:02:14 EVT LGC INH 1-02-2-18 LANCEMENT MP BD SANS VIRAGE LENT OFF
01 Sep 2013 08:04:55 ALM LO 2-03-2-08 PRESSION AIR DE LANCEMENT MP BD 15

01 Sep 2013 08:05:05 ACK LO 2-03-2-08 PRESSION AIR DE LANCEMENT MP BD 15

01 Sep 2013 08:05:07 ALM DISC 1-02-4-22 INDISPONIBILITE REPRISE POMPES ON

dans le memoInt:
/48/49/32/83/101/112/32/50/48/49/51/32/48/56/58/48/50/58/49/52/32/69/86/84/32/76/71/67/32/32/73/78/72/32/49/45/48/50/45/50/45/49/56/32/76/65/78/67/69/77/69/78/84/32/77/80/32/66/68/32/32/32/32/32/83/65/78/83/32/86/73/82/65/71/69/32/76/69/78/84/32/32/32/79/70/70/32/13/48/49/32/83/101/112/32/50/48/49/51/32/48/56/58/48/52/58/53/53/32/65/76/77/32/76/79/32/32/32/50/45/48/51/45/50/45/48/56/32/80/82/69/83/83/73/79/78/32/65/73/82/32/68/69/32/32/32/32/32/76/65/78/67/69/77/69/78/84/32/77/80/32/66/68/32/32/32/32/32/32/32/32/32/49/53/32/13/13/48/49/32/83/101/112/32/50/48/49/51/32/48/56/58/48/53/58/48/53/32/65/67/75/32/76/79/32/32/32/50/45/48/51/45/50/45/48/56/32/80/82/69/83/83/73/79/78/32/65/73/82/32/68/69/32/32/32/32/32/76/65/78/67/69/77/69/78/84/32/77/80/32/66/68/32/32/32/32/32/32/32/32/32/49/53/32/13/13/48/49/32/83/101/112/32/50/48/49/51/32/48/56/58/48/53/58/48/55/32/65/76/77/32/68/73/83/67/32/49/45/48/50/45/52/45/50/50/32/73/78/68/73/83/80/79/78/73/66/73/76/73/84/69/32/32/32/32/32/82/69/80/82/73/83/69/32/80/79/77/80/69/83/32/32/32/32/32/32/32/32/32/32/79/78/32
Commenter la réponse de marin1617
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 14:30
0
Merci
@jderf :
Un truc que je pige pas bien sur la doc que tu fais passer : la propriété IsAsyncCompleted() attend la fin de lecture, mais sur l'appel à la lecture, on lui passe en paramètre une longueur. Comment ça se passe si on reçoit des chaînes de longueur variables.
Ex :
1ère réception : "delphi" (soit 6 caractères)
2ème réception : "Embarcadero" (soit 11 caractères)
Si on fait un ReadStrAsync sur 11 caractères, ne risque-t'on pas de récupérer "delphiEmbar" ?
Commenter la réponse de sp40
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 14:37
0
Merci
...C'est pour ça que je demande si c'est une lecture continue, une demande etc...
Essaye avec ça en espérant que le caractère de fin de trame est #13#10 ( ou #13 ou #10 ou #6 ou #6#13#10 etc... mais ça c'est dans la doc de l'appareil qui renvoi la trame...)
var
    Form1: TForm1;
    MonMessage : string;
...
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
    TrameCp     : string;
    PosEndTrame : Integer;
    NouveauMsg : string;
begin
    MonMessage := MonMessage + ComPort1.ReadStr(NouveauMsg, Count);
    MonMessage := Uppercase(MonMessage);
    PosEndTrame := Pos(#13#10, MonMessage);
    if PosEndTrame <> 0 then
        while PosEndTrame <> 0 do
        begin
            TrameCp := Copy(MonMessage, 0, PosEndTrame -1);
            memorecept.Lines.Add(TrameCp);
            if (Pos(' ALM ', TrameCp) + Pos(' ACK ', TrameCp) + Pos(' RTN ', TrameCp)) <> 0 then
                memoLog.Lines.Add(TrameCp);
            MonMessage := Copy(MonMessage, PosEndTrame +2, Length(MonMessage));
            PosEndTrame := Pos(#13#10, MonMessage);
        end;
end;


--
Commenter la réponse de cs_yanb
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 14:49
0
Merci
j'ai du ajouter
  MonMessage := MonMessage + inttostr (ComPort1.ReadStr(NouveauMsg, Count));


Avec ton code cs_yanb, je ne recoit rien
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 15:29
@simonpelloquin oui c'est aussi ce que j'ai pensé au départ mais c'est 53/32/13/13/48/49 qui me fait dire que c'est juste #13 par contre y a la total d'espace qui sont pas présent dans la discussion...je viens de tester c'est le site qui supprime les espaces en trop
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 15:42
@yanb :
euh... désolé d'insister mais sur cet ligne, tu as 49/53/ pour "15" puis 32/13/ pour le changement de lignes, puis /13 pour un nouveau saut de ligne, puis 48/49/ pour le "01" de la ligne suivante.
Et sur la première ligne tu as 79/70/70/ pour "LENT", 32/13/ pour le changement de lignes et 48/49/ pour le "01"
A mon humble avis, la fin de ligne "utile" est bien #32#13. Si on s'intéresse uniquement au #13, on risque d'analyser également les sauts de ligne (comme après le 49/53/ de la fin de la deuxième ligne), ce qui apporte peu d'intérêt (et peut peut-être occasionner des plantages...)
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 15:57
@Simonpelloquin : Oui tu as raison sur le fait que ça change pas grand chose et peu d'intérêt ;-) ce que je soupçonne c'est justement que c'est une trame avec une réponse vide ou une fin de requête complète. Sur certain appareil la fin d'une requête à plusieurs réponse (groupe) est #13#13 ou #6#13 pour justement informer la fin de traitement. Ensuite ici peut-être que la fin de trame est #32#13 et la fin de la demande est #32#13#13...je sais pas c'est véritablement la doc qui peut le dire :p
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 sept. 2013 à 16:04
Mais on y voit déjà plus clair en ascii :-D bah dans tous les cas nos codes avec cette information devraient fonctionner ;-) ben normalement :p
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 16:27
Nan, malheureusement, le mien ne tient pas compte qu'on peut lire des caractères à cheval sur deux trames... :-(
Commenter la réponse de marin1617
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 14:53
0
Merci
Simonpelloquin, comment puis-je modifier la propriété IsAsyncCompleted()
Commenter la réponse de marin1617
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 5 sept. 2013 à 15:08
0
Merci
@Simonpelloquin

Je ne suis pas spécialiste du port com, je découvre avec cette discussion.

Pour moi, si j'ai bien compris en asynchrone, tu précise le nombre de caractère voulu, le Tcomport t'envoi IsAsynCompleted() lorsque que le buffer contient le nombre souhaité de caractère.

D'ou ceci

// Lecture non-bloquante de la longueur demandée
    // Attention, la chaine doit rester accessible hors de l'événement...
    Chaine:='';
    Comport1.ReadStrAsync(Chaine,seLongueur.Value,ReadAsyncPtr);
    Repeat
      // Ici on n'est pas bloqué, on peut donc traiter les messages Windows
      Application.ProcessMessages;
      // Attente de la fin de traitement
    Until Comport1.IsAsyncCompleted(ReadAsyncPtr);


Jderf
--
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 5 sept. 2013 à 15:12
C'est d'ailleur bien exprimé dans la doc

"Pour gérer la structure de trace, on dispose de deux méthodes du TComPort.
IsAsyncCompleted() permet de savoir si la réception en cours est terminée ou non. Elle retourne True si le nombre de caractères demandés est bien reçu ou si un time-out intervient.
WaitForAsync() permet d'attendre la fin de la réception. Cette méthode est bloquante, il convient donc de ne l'appeler que si IsAsyncCompleted a retourné True avant. Elle permet en outre de connaître le nombre de caractères réellement reçus. "
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 15:15
oui... mais si on reçoit des trames de longueur variable, comme ça a l'air d'être le cas pour notre ami Popeye (euh non Le marin, pardon...) on peut difficilement lui dire de lire un nombre de caractères que l'on ne connait pas à l'avance...
Commenter la réponse de jderf
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 15:18
0
Merci
Resalut,

Alors, visiblement, ta trame se termine par #32#13.
Par contre y a des trucs bizarres, t'as des passages dans tes trames où il y a gavé de "32" (= espace). Comment ça se fait qu'on ne les retrouve pas dans le memo ???

Essaie avec ce code et poste le résultat (et ton code si tu le modifies)
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); // Gestion de lecture du port Com
var 
	mess       : string; // Message en capitales pour analyse
	NouveauMsg : string; // Nouvelles données lues
begin
	// Lecture flux comport
	comport1.ReadStr(NouveauMsg, Count);
	MonMessage := MonMessage + NouveauMsg;
	// Si on détecte une fin de ligne dans la ligne en cours de rédaction
	if pos(#32#13, MonMessage) <> 0 then begin
		// Ajout dans le memo d'infos de réception
		memorecept.Lines.Add(MonMessage);
		mess := Uppercase(MonMessage);
		// Recherche des informations à épingler dans le memolog (pas besoin à priori de repasser toutes les
		// lignes du memorecept...)
		if (pos(' ALM ', mess) + pos(' ACK ', mess) + pos(' RTN ', mess)) <> 0 then begin
			// Ajout dans memolog
			if memoLog.Lines.IndexOf(mess) = - 1 
				then memoLog.Lines.Add(mess);
		end;
		// Réinitialisation suite à fin de ligne
		MonMessage := '';
	end;
	Application.ProcessMessages;
end;

Commenter la réponse de sp40
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - Modifié par jderf le 5/09/2013 à 15:43
0
Merci
@Simon

A je vois ce que tu veux dire.

Oui comme un rebobiner qui fuit, tu ne connais pas le nombre de goutte à venir, ni la fréquence. Donc soit tu te fixes de récupérer un gobelet, soit tu te fixe de rester 10 minutes devant ton robinet !!

Tu as cela dans la doc, tu fixes le nombre de caractère et le timeout, IsAsyncCompleted() te renvoi true au premier des deux.


--
Commenter la réponse de jderf
marin1617 42 Messages postés samedi 3 août 2013Date d'inscription 15 août 2014 Dernière intervention - 5 sept. 2013 à 15:42
0
Merci
Merci à vous, mon programme fonctionne avec ce code :

var
    Form1: TForm1;
    MonMessage : string;
...
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); }
var
    TrameCp     : string;
    PosEndTrame : Integer;
begin
    ComPort1.ReadStr(NouveauMsg, Count);
    MonMessage := MonMessage + NouveauMsg;
    MonMessage := Uppercase(MonMessage);
    PosEndTrame := Pos(#13, MonMessage);
    if PosEndTrame <> 0 then
        while PosEndTrame <> 0 do
        begin
            TrameCp := Copy(MonMessage, 0, PosEndTrame -1);
            memorecept.Lines.Add(TrameCp);
            if (Pos(' ALM ', TrameCp) + Pos(' ACK ', TrameCp) + Pos(' RTN ', TrameCp)) <> 0 then
                memoLog.Lines.Add(TrameCp);
            MonMessage := Copy(MonMessage, PosEndTrame +1, Length(MonMessage));
            PosEndTrame := Pos(#13, MonMessage);
        end;
end;


Un grand merci et continuez à nous pousser vers le haut....
Le marin
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 5 sept. 2013 à 16:00
ok, yanb très bon ce code !!!
Et bravo à marin pour les balises de code !!!
Commenter la réponse de marin1617

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.