Einzelnen Beitrag anzeigen

Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Indy 10 TCP-Client Strings Lesen

  Alt 11. Nov 2010, 22:14
Guten Morgen allerseits,

Ich habe mir ein neues Spielzeug (AVR-Net-IO) gekauft und wollte dies nun Gleich ansteuern.

Dieses Tolle Ding kann man mittels IP und Port ansteuern, das funktioniert soweit auch wunderbar.

Delphi-Quellcode:
  // Client erstellen
  IdTCPClient1 := TIdTCPClient.create(self);
  IdTCPClient1.Port := 50290;
  IdTCPClient1.Host := '192.168.168.101';

  // Daten Senden
  If Not IdTCPClient1.Connected Then
    IdTCPClient1.Connect;
  If IdTCPClient1.Connected Then Begin
    IdTCPClient1.IOHandler.WriteLn(Edit1.text + '\r\n');
  End;
  IdTCPClient1.Disconnect;
Mein Problem ist nun das Auslesen der "Antwort" des Boards

Das dies mittels
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn()); geht, weis ich zwar, doch es bringt mir nicht viel. Das Board sendet unterschiedlich viele Daten zurück. Im Normalfall ein NAK oder ein ACK beides ist eine Zeile Lang.
Aber ab und zu sendet es mal 3 Zeilen.

Mein Programm hängt sich genau dann auf, wenn ich nicht exakt die Richtige Anzahl an Readln Befehlen benutze.

Leider gibt es irgendwie keinen Befehl wie

Delphi-Quellcode:
  While not (eof) do begin
  end;
// Ich habe zwar
    While Not IdTCPClient1.IOHandler.InputBufferIsEmpty Do Begin
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
    End;
// gefunden, aber das ist immer True = es wird nie gelesen
Glücklicherweise weis ich genau wann 3 Zeilen Antworten kommen und wann 1 Zeilen Antworten kommen, kann also einen "Workaround" für das Problem anbieten :

Delphi-Quellcode:
If Not IdTCPClient1.Connected Then
    IdTCPClient1.Connect;
  If IdTCPClient1.Connected Then Begin
    IdTCPClient1.IOHandler.WriteLn(Edit1.text + ' \r\n');
    If lowercase(Edit1.text) = 'versionThen Begin
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
    End
    Else
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
  End;
  IdTCPClient1.Disconnect;
Das Problem allerdings ist, dass ich das ganze in eine Komponente packen will die ich "Häufiger" nutzen möchte. Das AVR Board hat einen µ-Controller, den ich natürlich noch Umprogrammieren will. Und wie viele Zeilen die Zukünftigen Antworten haben, dass kann ich natürlich jetzt noch nicht wissen.

Die Frage lautet also : Wie bekommt man heraus wann kein Readln mehr nötig ist?
Oder gibt es tatsächlich nur die Variante, dass ich dies vorher wissen muss ?

P.S.: mit Synapse hab ichs auch versucht ( Hier der Post dazu..
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01

Geändert von Corpsman (12. Nov 2010 um 05:50 Uhr)
  Mit Zitat antworten Zitat