Autor Beitrag
spacemanspiff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.04.12 10:13 
Hallo,

ich benutze das erste Mal die Indy-Komponenten und wahrscheinlich übersehe ich irgendwas.

Ich bin via Ethernet mit einem Embedded Device verbunden, dass einen TCP-Server impementiert. Der Delphi-Client soll nun Timer-gesteuert alle 1000ms Daten von dem Device abfragen.

Die ersten vier Bytes der Nutzdaten sind immer ein UINT32. Dieser gibt an, wie viele Bytes noch kommen. Danach folgen abwechselnd 4 Bytes UINT32 (index) und 4 Bytes SINGLE (wert).

Bisher versuche ich die Daten so zu lesen (zu Testzwecken nicht per Timer, sondern per ButtonPress, Connection besteht bereits):

ausblenden volle Höhe Delphi-Quelltext
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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TMain.Button5Click(Sender: TObject);
var
  A: System.TArray<System.Byte>;
  B: Array [0..3of Byte;
  S: Single absolute B;
  Count: Integer;
  i: Integer;
begin
  if TCP.Connected then
  begin
    with TCP do
    begin
      try
        IOHandler.WriteLn( 'G' );   //empfängt das Embedded Device den Identifizierer 'G', weiss es, dass es Daten senden soll
        Count := IOHandler.ReadLongInt();
        Memo1.Text := IntToStr( Count ) + #13#10#13#10;

        while i < Count do
        begin
          Memo1.Text := Memo1.Text + IntToStr( IOHandler.ReadLongInt() ) + '___';
          IOHandler.ReadBytes(A, 4, False);
          B[0] := A[0];
          B[1] := A[1];
          B[2] := A[2];
          B[3] := A[3];
          Memo1.Text := Memo1.Text + FloatToStr( S ) + #13#10;
          i := i+8;
        end;
      finally
        //Disconnect;
      end;
    end;
  end;
end;


Das Problem, das nun auftritt: In der Regel empfange ich das erste Paket vollständig. Da es ein Testpaket ist, kenne ich die Daten und kann diese vergleichen. Wenn ich den Button ein weiteres Mal auslöse, kann es sein, dass ein ReadTimeout aufgeworfen wird und nur die Variable Count im Memo ausgegeben wird. Bei dem nächsten ButtonPress kommt i.d.R. dann nur der erste Index und sein Wert. Und manchmal kommt bei Knopfdruck der ganze Rest und ein komplettes neues Paket.

Sieht jemand von Euch, woran es hapern könnte?

Falls Ihr weitere Info braucht nur zu :-)

Hoffe, jemand hat die springende Idee.

Danke und beste Grüße,
Thomas

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Hat sich erledigt... ist aber auch den Lesern wohl nicht aufgefallen...

Welchen Wert hat i noch gleich? ... Super, dass ich für so nen Kram mehrere Stunden brauche und jede Zeile wie irre lese und Wireshark-Captures anfertige und dann so was :-D