Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Komische" HEX-Codes (https://www.delphipraxis.net/115629-komische-hex-codes.html)

Tumm 15. Jun 2008 12:58


"Komische" HEX-Codes
 
Hi

Ich glaub ich stell mich einfach mal wieder zu dumm an. Die Forensuche hab ich schon bemüht, leider ohne richtiges Ergebnis.

Ich nutze die SynaSer Bibilothek um eine serielle Verbindung zu einem Gerät (Grafiktaschenrechner) aufzubauen.

Der Taschenrechner möchte als erstes gerne den HEX-Code 16 senden (so steht es zumindest auf einer Dokumentationsseite und so ist es glaube ich auch (siehe weiter unten)).

Zum Testen frage ich erstmal laufend den COM-Port auf neue Eingaben ab. Wenn ich auf dem Taschenrechner dann die Kommunikation starte, kommt in meinem Log am PC nur so ein Zeichen: "" Mann kann es anscheinend auch nicht richtig einfügen

Ich hab mir gedacht "Schön, dass is ein HEX-Code also auch eine Zahl" und erstmal das ganze versucht in einen Integer umzuwandeln. Geht nicht (Ungültiger Integerwert).

Daraufhin hab ich bei Google nach diesem Zeichen gesucht, weil ich sonst auf keine andere Weise dahintergekommen bin, was dieses Zeichen nun wirklich ist.
Als Suchquery hat Google dann angezeigt: %16, die Zahl ist also irgendwie in diesem Zeichen.

Das Problem ist nur, dass ich nicht weiß, wie ich das komische Zeichen in meinem Delphiprogramm zu der 16 bekomme bzw. eine andere Dezimalzahl in so ein komisches Zeichen umwandeln kann, was der Taschenrechner versteht.

Zacherl 15. Jun 2008 13:05

Re: "Komische" HEX-Codes
 
Was du da hast ist vermutlich das Zeichen #22. Die 16 ist in Dezimalschreibweise eine 22. Mit Ord() kannst du das Char in eine Zahl umwandeln.

Tumm 15. Jun 2008 13:10

Re: "Komische" HEX-Codes
 
Thx :D

Es funktioniert:

Delphi-Quellcode:
var
s:String;
P:Char;
begin
 try
  s := ser.RecvPacket(50); //Fragt den COM-Port ab
 except
  s := '';
 end;
  if length(s) > 0 then begin
    Memo1.Lines.Add(s); //Schreibe "das Zeichen" ins Log
    p := s[1]; //Speichert das erste Zeichen in P
    Memo1.Lines.Add(IntToStr(ord(p))); //Schreibe den Zeichencode ins Log
end;

Cyf 15. Jun 2008 17:21

Re: "Komische" HEX-Codes
 
Zitat:

Zitat von Tumm
Thx :D

Es funktioniert:

Delphi-Quellcode:
var
s:String;
P:Char;
begin
 try
  s := ser.RecvPacket(50); //Fragt den COM-Port ab
 except
  s := '';
 end;
  if length(s) > 0 then begin
    Memo1.Lines.Add(s); //Schreibe "das Zeichen" ins Log
    p := s[1]; //Speichert das erste Zeichen in P
    Memo1.Lines.Add(IntToStr(ord(p))); //Schreibe den Zeichencode ins Log
end;

Es sollte doch auch ein einfacher Cast nach Integer mit Integer(p) möglich sein, oder?
(Bewegt nicht die Welt, aber man spart einen Funktionsaufruf.)
Warum überprüfst du nochmal, ob die Länge größer als 0 ist, statt das direkt im try-Block auszuführen?
Try-Blöcke sollten kurz gehalten werden, aber das macht imho wenig Sinn.
Weiterhin stimmt was mit deinen end; nicht.
Nur als Anregung gemeint. :)
In eigener Sache, es wäre wikrlich sehr schön, wenn du kurz sagen könntest, was du für ein Objekt um auf die seielle Schnittstelle zuzugreifen, habe das vor einiger Zeit mal gesucht und nicht gefunden und auch die OH ist nicht seh auskunftsfreudig.

3_of_8 15. Jun 2008 17:31

Re: "Komische" HEX-Codes
 
Wieso sollte das einen Funktionsaufruf sparen?

Cyf 15. Jun 2008 17:41

Re: "Komische" HEX-Codes
 
Weil ord() wahrscheinlich auch nichts anderes macht, als as ganze in einen neuen Stack-Frame zu kopieren, dann zu casten und dann als Rückgabewert zurück zu liefern, während der Cast, denke ich, nur die Fehlermeldung deaktiviert, da ja eigentlich an den Daten nichts verändert wird, außer das du garantierst, dass du weißt was du tust. Sollte ich mich hier irren, so Asche über meein Haupt. Ich neige sowieso dazu, mir das ganze direkt so vorzustellen, da ich das damals in C gelernt hab und das sich ohnehin nicht darum schert, ob du mit einem Char eine kleine Zahl (8 Bit (unsigned) bzw. 7 Bit + Vorzeichen (signed)) meinst. Bei der Gelgenheit, könnte man hier das ganze auch gleich als Byte deklarieren, falls man das Zeichen nicht mehr bräuchte und es hier nur zu Testzwecken verwendet wird.

Apollonius 15. Jun 2008 17:45

Re: "Komische" HEX-Codes
 
Ord wird mit Compilermagic umgesetzt zu einem Cast in den kleinstmöglichen ordinalen Typen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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