AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke FreePascal Indy 10 TCP-Client Strings Lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 TCP-Client Strings Lesen

Ein Thema von Corpsman · begonnen am 11. Nov 2010 · letzter Beitrag vom 12. Nov 2010
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz