Ich schreibe ein Programm zur steuerung eine Modellbahn. Ich schicke Daten über
TCP (
TClientSocket) an eine Modellbahn Zentrale.
Die Daten bestehen aus 13 Bytes
Ich bekomme diese 13 Byte leicht verändert wieder zurück.
- Bytes 1 bis 4 sind die Meldungskennung.
- Byte 5 entspricht dem DLC der CAN-Meldung.
- Bytes 6 - 13 sind die entsprechenden Nutzdaten.
Wie kan ich diese jetzt wieder zerlegen um
Zun Beispiel den PowerOn Button schickt 00004711 5 00 00 00 00 01
procedure TForm1.PowerOnButtonClick(Sender: TObject); //00004711 5 00 00 00 00 01 GO Alle
Var i : Integer;
mySendingString : String;
myDLC : Byte; //Anzahl der Datenbytes im CAN-Paket, 1 Byte
myPrio : Byte; //Priorität des befehls
myResponseBit : Byte; // wenn wir als PC-Programm senden, ist dieses Bit immer 0
myStartWord : SmallInt; // die Kombination aus Prio, Command und Responsebit
myUID : Integer; // Zieladresse des Objektes auf dem CAN, 32 Bits
myHash : SmallInt; // unser Hash, 16 Bits
myCommand : Byte; // unser Befehl, 8 Bits
mySubCommand : Byte; // unser Unterbefehl, 8 Bits
myDataBytes : Array[0..7] of Byte; // array[0..7] of Byte,
begin
myPrio := 0; // wir haben keine Priorität
myCommand := 0; // 0x00 = 0 Systembefehl
mySubCommand := 1; // Power ON - System Go (0x01)
myHash := 18193; // wie im Beispiel, kann aber auch &h0300 sein (als Minimum)
myDLC := 5; // 5 Bytes Nutzdatenlänge
myUID := 0; // UID = 0 bedeutet: sende den Befehl an alle
for i := 0 to 7 do myDataBytes[i] := 0; //Märklins Doku zählt auch von D0 .. D7
myStartWord := ( ((myPrio SHL 12) + (myCommand SHL 1) + (myResponseBit AND 1)) AND 255 );
myDataBytes[0] := ((myUID SHR 24) AND 255); // Big Endian encoding
myDataBytes[1] := ((myUID SHR 16) AND 255);
myDataBytes[2] := ((myUID SHR 8) AND 255);
myDataBytes[3] := (myUID AND 255);
myDataBytes[4] := mySubCommand;
mySendingString := Chr((myStartWord SHR 8) AND 255) + Chr(myStartWord AND 255);
mySendingString := mySendingString + Chr((myHash SHR 8) AND 255) + Chr(myHash AND 255);
mySendingString := mySendingString + Chr(myDLC AND 255);
for i := 0 to 7 do mySendingString := mySendingString + Chr(myDataBytes[i] AND 255);
CS2ClientSocketSend.Socket.SendText(mySendingStrin g);
end;
Wenn ich die Antwort in eine Memo gebe sehe ich nichts.
CS2MeldungenMemo.lines.add('Empfangen : ' + Socket.ReceiveText + IntToStr(Length(Socket.ReceiveText)));
zeigt mir nur 'Empfangen :'