Copie de ligne d'un memo vers un autre memo

Résolu
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019 - 3 sept. 2013 à 09:12
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 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

20 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par ichiriac le 3/09/2013 à 18:00
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; 
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
3 sept. 2013 à 17:22
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...
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
3 sept. 2013 à 17:24
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) ?
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
3 sept. 2013 à 18:09
Excuse, je débute avec codes sources
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 11:05
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.
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 11:38
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...
--
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 11:46
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...)
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 12:01
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 ?
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 12:06
Pardon, milles excuses...

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

0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 12:02
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...
--
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 12:11
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...
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 12:24
tu sélectionnes ton code et tu cliques sur le bouton <> en haut ;-)
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
5 sept. 2013 à 13:48
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

--
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 14:27
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
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 14:30
@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" ?
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 14:37
...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;


--
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 14:49
j'ai du ajouter
  MonMessage := MonMessage + inttostr (ComPort1.ReadStr(NouveauMsg, Count));


Avec ton code cs_yanb, je ne recoit rien
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 14:55
Raaa, voilà ce que c'est d'écrire les codes à l'arrache :-(
c'est comme ca en fait
ComPort1.ReadStr(NouveauMsg, Count);
MonMessage := MonMessage + NouveauMsg;
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 14:59
Tu recevra quelque chose si la fin de trame est bien #13#10 sinon faut modifier par #13 ou #10 ou #6 etc...la fin de trame en gros voir doc appareil...et ensuite mettre les bonnes valeurs dans copy pour PosEndTrame -x et PosEndTrame +x
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
5 sept. 2013 à 15:14
Pfff j'avais pas vu le retour de l'ascii donc c'est #13
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;
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 15:20
hum, d'après le retour ascii, je propose plutôt #32#13 (cf mon code en bout de topic)
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
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
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 14:53
Simonpelloquin, comment puis-je modifier la propriété IsAsyncCompleted()
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
5 sept. 2013 à 15:08
@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
--
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
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. "
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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...
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 15:18
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;

0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
Modifié par jderf le 5/09/2013 à 15:43
@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.


--
0
marin1617 Messages postés 42 Date d'inscription samedi 3 août 2013 Statut Membre Dernière intervention 17 décembre 2019
5 sept. 2013 à 15:42
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
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
5 sept. 2013 à 16:00
ok, yanb très bon ce code !!!
Et bravo à marin pour les balises de code !!!
0
Rejoignez-nous