Ich habe schon mal Delpi 10.3 installiert und ausprobiert. Da ich in Meinem Programm zur steuerung auch andere Zentralen habe brauch ich auch einen Comport zugriff.
Das habe ich mit Delphi 10.3 versucht aber die Daten die ich dort bekam waren nicht wie in Delphi 7.
Etwas mit der veränderung der Variabelen ab Delphi 9 glaub ich. AnsiString und AnsiChar
https://www.delphipraxis.net/204574-...ml#post1466719
Deshab bin ich wieder zu Delphi 7 zurück.
Ich verwende ein TClientSocket und damit kann ich nachrichten schicken die von der zentrale erkannt werden.
Die Zentrale musste mir dieselbe nachricht, nur 1 Byte verändert wieder zuruck schicken. Ich sehe aber keine Antwort.
###Meine Senden Procedure
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; // Byte - wir haben keine Priorität immer 0
myCommand := 0; // Byte - 0x00 = 0 Systembefehl
mySubCommand := 1; // Power ON - System Go (0x01)
myHash := 18193; // SmallInt - wie im Beispiel, kann aber auch &h0300 sein (als Minimum)
myDLC := 5; // Byte
myUID := 0; // Integer - 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);
ClientSocket1.Socket.SendText(mySendingString );
###
Antwort in
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
Begin
CS2MeldungenMemo.lines.add('Empfangen : ' + Socket.ReceiveText);
End;
Die Antwort sollte immer Ursprünglicher Befehl mit gesetztem Response Bit sein.
Wie zerlege ich die antwort wieder in Bytes.