![]() |
TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Hallo zusammen,
ich habe eine Variable vom Typ Word und beschreibe diese mit dem Wert 999. Anschließend wandle ich das in TIdBytes um und will es versenden über TIdTCPClient. Das versenden klappt, es kommt auch im Server an. Nur wenn ich mir den Inhalt von "aBytes" angucke vor dem versenden, steht da 231 und 3 drinne (in den beiden Bytes). Wenn ich im Server etwas empfange, wandle ich die IdBytes wieder in ein Word um. Versenden:
Delphi-Quellcode:
Empfang:
var
myValue : Word; aBytes : TIdBytes; begin myValue := 999; aBytes := ToBytes(myValue); end;
Delphi-Quellcode:
Der Empfang (Server) wartet auf eine Nachricht und liest diese als String ein (mit Abschlusscharacter, da verschiedene Nachrichten empfangen werden können). Dieses String wandle ich wieder in IdBytes um, damit ich für die Auswertung komplett mit den IdBytes arbeiten kann.
var
myValue : Word; aBytes : TIdBytes; //Empfang... -> tmpStr = Eingangsstring vom TIdTCPServer aBytes := ToBytes(tmpStr); myValue := BytesToWord(aBytes); Mein Problem ist jetzt, dass beim Empfang in den Bytes bereits etwas anderes steht wie beim absenden. Absenden: 231 und 3 Empfang: 63 und 3 Könnt ihr mir da vielleicht weiterhelfen? Den Empfang direkt als TIdBytes einlesen kann ich nicht, da ich da eine Bytesanzahl angeben muss, die ich einlesen will. Aber ich kann verschiedene Telegrammlängen empfangen, deswegen gehe ich über ein String mit Abschlusscharacter und kann darüber entscheiden, was ich mit der jeweiligen Nachricht mache. Grüße |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Moin, Moin,
Ich versende unter anderem Daten vom Typ Word in einem TBytes Array (Maschinensteuerung) und zwar wie folgt :
Delphi-Quellcode:
In Bytes wandeln : ADataArr[0] := Lo(myWordValue); // low Byte ADataArr[1] := Hi(myWordValue); // high byte und wieder in ein Word wandeln : WordRec(myWordValue).Lo := ADataArr[0]; WordRec(myWordValue).Hi := ADataArr[1]; wobei ADataArr vom Typ TBytes ist. auslesen vom Indy Server kannst Du wie folgt : if not AContext.Connection.IOHandler.InputBufferIsEmpty then begin AContext.Connection.IOHandler.InputBuffer.ExtractToBytes( LRxBuffer); end; LRxBuffer ist auch vom Typ TBytes Funktioniert in meinem fall perfekt !! Beste Grüße Michael |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Du schickst also folgendes los
Code:
Diese beiden Bytes gehen in der Reihenfolge auf die Reise.
999 = 0x03E7 => 0xE7, 0x03
Beim Umwandeln der Nachricht von
Delphi-Quellcode:
nach Bytes kommt das heraus
string
Code:
Und warum bekommst du ein ??
0x3F, 0x03 => 0x033F = 831
? #03 Ganz einfach, weil 0xE7 größer ist als 0x7F und das wird umgewandelt in
Delphi-Quellcode:
ah ja ...
function TIdASCIIEncoding.GetBytes(const AChars: PIdWideChar; ACharCount: Integer;
ABytes: PByte; AByteCount: Integer): Integer; var P: PIdWideChar; i : Integer; begin P := AChars; Result := IndyMin(ACharCount, AByteCount); for i := 1 to Result do begin // replace illegal characters > $7F if UInt16(P^) > $007F then begin ABytes^ := Byte(Ord('?')); end else begin ABytes^ := Byte(P^); end; //advance to next char Inc(P); Inc(ABytes); end; end; |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
und wie müsste man es auf die Reise schicken, damit es richtig ankommt?
Dachte die TIdBytes Struktur (array) und die ganzen Umwandelfunktionen kann ich dafür nehmen?! |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Im Prinzip kannst du das nehmen, aber du siehst ja selber, dass du nicht weisst, was du da wirklich annehmen sollst und wie.
Die Lösung lautet: Protokoll Definiere ein Protokoll was jede Nachricht einhalten muss, damit der Server weiß, was da geschickt wird und wie er damit umgehen muss. Beispiel:
Code:
Der Server empfängt nun ein Byte, dann 2 Bytes, dann die Nachricht und das letzte Byte, prüft die Nachricht gegen die Prüfsumme und verteilt die Nachricht anhand des Nachrichtentyps.
Nachrichtentyp 00-FF (1 Byte)
Länge der Nachricht 0000-FFFF (2 Bytes) Payload (x Bytes) // Hier sind die echten Daten drin Prüfsumme 00-FF (1 Byte) |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Ja ok, ich kann dann genau die Telegrammart identifizieren und dann entsprechend mit dem Lo() und Hi() arbeiten.
Trotzdem finde ich es ein wenig verwunderlich, dass ich in die Funktion "ToBytes" alle möglichen Datentypen reingeben kann und ich kann auch TIdBytes versenden über TIdTCPClient (IOHandler.Write) aber dann die Auswertung schief geht, weil etwas als "illegal characters" erkannt wird. Wofür gibt es dann die komplett fertigen Funktionen um sich die TIdBytes entsprechend eines Datentypes x erstellen zu lassen und anschließend kann ich es so nicht versenden bzw der Empfang interpretiert das als ungültig. Dann kann ich mir auch gleich selber das Format überlegen und schicke es z.B. als String und nehme den dann komplett auseinander... |
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
Es ist halt immer die Badehose Schuld :roll:
|
AW: TIdBytes, Variable deklariert als Word und versenden mit TCPIP
? Sorry, verstehe den Satz nicht :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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 by Thomas Breitkreuz