Stocker et dépiler avec TcomPort et timer [Résolu]

YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 27 avril 2012 à 16:14 - Dernière réponse : YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention
- 3 mai 2012 à 11:07
Bonjour, Je suis débutant en delphi et j'ai un projet à réaliser dans le cadre de mon stage. Je n'ai pratiqué que le C /C++ durant mon cursus universitaire.
Je récupère des bites toutes les 1ms environs venant d'une carte pendant 30ms. Je les recois par l'intermédiare du composant TComPort. Comme ceci :

Timer1.Enabled:=true;
   inc(_pucQueueFilePocket); //incrémentation du pointeur de queue de file
   Long:=ComPort1.InputCount; 
   ComPort1.Read(Chaine, Long);


dans onRxChar.
Ensuite je voudrais à l'aide d'un pointeur de tete de file et un pointeur de queue de file afficher les caractères dans un mémo jusqu'à ce que le pointeur de tête de file soit égale au pointeur de queue de file.
Le pointeur de queue de file s'incrémente à chaque réception de caractère et on execute le timer qui doit réceptionner le caractère pointé par le pointeur de tete de file et on incremente ce pointeur.
dans mon timer j'ai commencer ceci:

if _pucQueueFilePocket = @Chaine[Long]  then 
   _pucQueueFilePocket:=@Chaine[0]; //réinitialisation du pointeur

  while _pucQueueFilePocket<>_pucTeteFilePocket do
  begin
    for j:=0 to Long-1 do
    begin
    _pucTeteFilePocket:=@Chaine[j];
    Trame:=Trame+bytetostr(_pucTeteFilePocket^[j]);
    Memo1.Text:= Trame; //Affichage dans le memo
    inc(_pucTeteFilePocket)//incrémentation du pointeur de tete de file
    end;
  end;

Mais ne fonctionne pas du tout.

Mes pointeurs sont préalablement initialisé comme ceci:
[i]new(_pucTeteFilePocket);
new(_pucQueueFilePocket);
_pucTeteFilePocket:=@Chaine[0];
_pucQueueFilePocket:=@Chaine[0];/i
Si l'on peut me donner des pistes ce serait avec paisir.
Merci,
N'hésitez pas à demander pour plus de renseignements ;)
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 3 mai 2012 à 11:07
3
Merci
j'ai réussi, en effet pas besoin de pointeur, voici mon code:
Dans le OnRxchar:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
    j:integer;
begin
  Long:=ComPort1.InputCount; 
  ComPort1.Read(Chaine, Long); 
  for j := 0 to Long do
    begin
      Chaine1[ucQueueFilepocket + j] := Chaine[j]; 
    end;
  ucQueueFilepocket := ucQueueFilepocket + Long;
  if ucQueueFilepocket >= 249 then
    begin
      ucQueueFilepocket := 0;
    end;
end;


Puis dans le Timer
procedure TForm1.Timer1Timer(Sender: TObject);
var
  str:Char;

begin
  if ucTeteFilepocket <> ucQueueFilepocket  then
    begin
     str:=char(Chaine1[ucTeteFilepocket]);
     if(str = #12) then
     begin
       Memo1.Clear;
     end
     else
     begin
          Memo1.Text := Memo1.Text + str;
     end;
     ucTeteFilepocket := ucTeteFilepocket + 1;
     if ucTeteFilepocket >= 249 then
        begin
          ucTeteFilepocket := 0;
        end;
     end;
end;

end.


avec:
ucTeteFilePocket  : integer;
  ucQueueFilepocket : integer;
  Long    : integer;
  Chaine  : array[0..250] of Byte;
  Chaine1 : array[0..250] of Byte;

Merci YB28 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de YB28
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 30 avril 2012 à 19:47
0
Merci
Salut,

il y a plusieurs erreurs dans ton code ...
il n'est pas utile de créer un nouveau pointeur (allouer de la mémoire) pour pointer sur une variable ...

le premier caractère d'une chaine de type string ne commence pas à zéro:
_pucTeteFilePocket:= @Chaine[0];
mais à un :
_pucTeteFilePocket:=@Chaine[1];

pour le reste je pense que c'est le devoir qui demande un timer sinon c'est pas utile ... ni les pointeurs d'ailleurs

toujours est il voici un petit exemple tout simple avec deux pointeurs (1 de début 1 de fin) pointant sur une chaine et on se sert du pointeur de début pour afficher la chaine caractère par caractère dans un Mémo:
[hr][b]var

  /baStr:  string  = 'juste une chaine pour tester';

procedure TForm1.Button4Click(Sender: TObject);
[b]var
  /bPIn, POut: Pointer;
[b]begin
  /b {Pointe sur le premier caractère}
  PIn : = @aStr[1];
  {Pointe sur le dernier caractère}
  POut :=  @aStr[Length(aStr)];
   {on affiche le résultat caractère par caractère}
  [b]repeat
    /bMemo1.Text : = Memo1.Text + Char(PIn^);
    Inc(Cardinal(PIn));
  [i]{jusqu'à ce que le pointeur de début soit plus grand que le pointeur de fin}
  /iuntil Cardinal(PIn) > Cardinal(POut);
end;
[hr]

ça devrait t'éclairer pour la suite


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Utilisateur anonyme - 30 avril 2012 à 22:32
0
Merci
Il n'y a pas que dans le code qu'il y a des erreurs :

Je récupère des bites


Chercher l'erreur
Commenter la réponse de Utilisateur anonyme
YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 1 mai 2012 à 13:51
0
Merci
Merci beaucoup Cirec de t'être penché sur mon sujet, je teste ca demain ;)
Commenter la réponse de YB28

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.