Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy 10 client <STX>Daten<ETX> senden (https://www.delphipraxis.net/190091-indy-10-client-stx-daten-etx-senden.html)

Grizu 29. Aug 2016 18:30

Indy 10 client <STX>Daten<ETX> senden
 
Hallo,
vielleicht kann jemand helfen.
ich habe einen Indy10 Client, der sich zu einem Server verbindet, nun möchte ich Daten die in einem TEdit stehen zum Server senden.
Dieser erwartet das die Daten in folgendem Format kommen: <STX>Daten<ETX>

Ich habe da nun heute einiges versucht, aber es funktioniert nicht.

zuletzt habe ich folgendes probiert:

Delphi-Quellcode:
MIRec.values := txt_interface_msc_sendstring.text;
  Buffer := RawToBytes(MIRec, SizeOf(MIRec));
  msc_client.IOHandler.Write(Buffer);
vorher habe ich das EDIT mal byteweise in ein TID Bytes gelesen
und dann vorher 02 für ETX und hinterher 03 für STX angehangen. Funktionierte aber auch nicht.
Delphi-Quellcode:
begin
a := Length(txt_interface_msc_sendstring.text);
dat := txt_interface_msc_sendstring.text;

i1 := 1;
i2 := 1;
setlength(s, i1);

s[0] := 02; // STX


for i := 1 to a do begin
i1 := i1 + 1;
setlength(s, i1);
s[i1] := ord(dat[i2]);
i2 := i2 + 1;
end;
i1 := i1 + 1;
setlength(s, i1);
edit3.Text := inttostr(i1);
s[i1] := 3; // ETX
a := length(s);
msc_client.IOHandler.Write(s);
Weiß jemand wie das geht???

SvB 29. Aug 2016 20:38

AW: Indy 10 client <STX>Daten<ETX> senden
 
Hallo,

wenn Du nur die 2 oder 3 sendest, dann wird die dezimale Zahl gesendet, in deinem Fall die 50 und die 51. Schau Dir mal eine ASCII-Tabelle an.
In Deinem Fall willst Du aber den dezimalen Wert 2 und 3 senden.
Du kannst das so machen:
Delphi-Quellcode:
s[0] := #2; // STX
s[i1] := #3; // ETX
Das sollte funktionieren

himitsu 29. Aug 2016 20:51

AW: Indy 10 client <STX>Daten<ETX> senden
 
Delphi-Quellcode:
s
scheint ein Byte-Array zu sein. Definition nicht mit gepostet und diese Info im Text versteckt.
(S ist ein blöder name, weil das Viele für eine "String"-Variable verwenden)

Pssst, er sendet eine
Delphi-Quellcode:
2
(Byte) und keine
Delphi-Quellcode:
'2'
(Char
Delphi-Quellcode:
#50
), also praktich ist das schon deine
Delphi-Quellcode:
#2
(Char)

CarlAshnikov 30. Aug 2016 06:28

AW: Indy 10 client <STX>Daten<ETX> senden
 
Ich würde das ganz einfach folgendermaßen machen:
Delphi-Quellcode:
var
  Daten: string;

msc_client.IOHandler.Write(chr(2) + Daten + chr(3));

Grizu 30. Aug 2016 10:20

AW: Indy 10 client <STX>Daten<ETX> senden
 
Hi,

erst mal danke für eure Ideen.

Also:
Delphi-Quellcode:
s[0] := #2; // STX
 s[i1] := #3; // ETX
Dann kommt die Fehlermeldung inkompatible Typen, weil s ein TiDBytes ist.

Delphi-Quellcode:
var
   Daten: string;

 msc_client.IOHandler.Write(chr(2) + Daten + chr(3));
Ist eine gute Idee, aber hier kompiliert er auch nicht. Wieder Fehlermeldung inkompatible Typen.

Ich war der Meinung das
Delphi-Quellcode:
s[0] := 2; // STX
 s[i1] := 3; // ETX
die richtige Rahmung ist. Aber anscheinend nimmt der Server das nicht an........
Ich versuch es mal weiter, aber danke euch für den Input.

hier nochmal der code mit der variablen Deklaration:
ich habe das s mal gegen BBytes ersetzt. Ist richtig s ist doof für ein Bytearray, sollte man nicht machen.

Delphi-Quellcode:
procedure TMain_Frm.btn_interface_msc_sendClick(Sender: TObject);
var
BBytes : TIDBytes;
dat, dattmp : String;
character : Char;
b : Byte;
i, a, i1, i2 : Integer;
begin
a := Length(txt_interface_msc_sendstring.text);
dat := txt_interface_msc_sendstring.text;

i1 := 1;
i2 := 1;
setlength(BBytes, i1);

BBytes[0] := 2; // STX


for i := 1 to a do begin
i1 := i1 + 1;
setlength(BBytes, i1);
BBytes[i1] := ord(dat[i2]);
i2 := i2 + 1;
end;

i1 := i1 + 1;
setlength(BBytes, i1);
BBytes[i1] := 3; // ETX

msc_client.IOHandler.Write(BBytes);
end;//*****************************************************************************************************************************************

Sherlock 30. Aug 2016 10:30

AW: Indy 10 client <STX>Daten<ETX> senden
 
Mir ist auch nicht ganz klar, warum Indy uns dieses Hindernis beschert hat, denn immerhin steht in der IdGlobal.pas:
Delphi-Quellcode:
TIdBytes = array of Byte;
Das ist ja nun wirklich kein Hexenwerk, aber man muss sich damit arrangieren, und immerhin produziert man damit delphibezogene SO-Einträge, was ja gut für die Popularität der Sprache ist :roll:

Aber die Unit IdGlobal bietet dann auch gleich die Lösung:
Delphi-Quellcode:
function ToBytes(beinahe alle erdenklichen Datentypen):TIdBytes; overload


Bau Deinen String und pack ihn als Argument da rein, fertig.

Sherlock

Grizu 30. Aug 2016 10:41

AW: Indy 10 client <STX>Daten<ETX> senden
 
Hallo nochmal,

manchmal einfach Kaffee trinken gehen, Zigarette und dann geht's....


es ist tatsächlich sooooooo einfach:

Delphi-Quellcode:
procedure TMain_Frm.btn_interface_msc_sendClick(Sender: TObject);
var
dat : String;
begin
dat := txt_interface_msc_sendstring.text;

msc_client.IOHandler.Write(2);
msc_client.IOHandler.Write(dat);
msc_client.IOHandler.Write(3);
end;//*****************************************************************************************************************************************
Man muss einfach das STX und ETX in einer einzelnen Message schicken und zwischen drin dann den String.....

Danke Carl dein Ansatz hat mich darauf gebracht.....

Grizu 30. Aug 2016 10:49

AW: Indy 10 client <STX>Daten<ETX> senden
 
So hab nochmal den Ansatz von Carl getestet und der geht natürlich auch.......

Bei mir war ja s ein TIDBytes deshalb meckert er, wenn man einen String nimmt geht's auch....

Delphi-Quellcode:
procedure TMain_Frm.btn_interface_msc_sendClick(Sender: TObject);
var
dat : String;
begin
dat := txt_interface_msc_sendstring.text;

msc_client.IOHandler.Write(chr(2) + dat + chr(3));
end;//*****************************************************************************************************************************************
Es ist also ein simpler 3 Zeiler......


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz