YB28
Messages postés38Date d'inscriptionlundi 23 avril 2012StatutMembreDernière intervention29 juillet 2012
-
27 avril 2012 à 16:14
YB28
Messages postés38Date d'inscriptionlundi 23 avril 2012StatutMembreDernière intervention29 juillet 2012
-
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 ;)
YB28
Messages postés38Date d'inscriptionlundi 23 avril 2012StatutMembreDernière intervention29 juillet 20121 3 mai 2012 à 11:07
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;
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 30 avril 2012 à 19:47
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]