![]() |
Binäres Senden und Empfangen über die serielle Schnittstelle
Erstmal ein freudiges HALLO ins Forum...
Ich habe gerade mit Delphi (benutze Delphi6.0) angefangen und auch schon (mindestens) ein Problem. Ich übertrage Daten von einem externen 8-Bit A/D-Wandler(am ATMEL µ-Controller mit UART-Schnittstelle) über die serielle Schnittstelle zum PC. Zum empfangen der Daten in Delphi benutze ich die Erweiterung „TurboPower Async Professiona (TPAP)l“ für den Zugriff auf die serielle Schnittstelle. Das empfangen der Daten funktionier schon mal :) Jetzt zu dem Problem: Beim Auslesen der Schnittstelle liefert mir die Funktion „TApdComPort.GetChar“ nur einen Char zurück. Dabei werden die ursprünglich empfangenen Daten von Delphi als ASCII-Wert interpretiert. Wenn das Programm also eine Byte 0x2B empfängt (dezimal 43), macht Deplhi daraus einen Char mit dem Inhalt '+', was dem ASCII-Wert von 43 entspricht. Ich brauche aber die binären Daten in Form von Integer, da ich die Daten ja binär und nicht in ASCII über die serielle Schnittstelle versenden will (und muss, weil das schneller ist). Wenn ich also das Byte 0xFF am µC losschicke, brauche ich genau diesen Wert in Delphi. Wie gelingt mir diese Rückwandlung?? (bzw. gibt es anderes Möglichkeiten die das Problem gänzlich umgehen) Vielen Dank schon mal, Johannes |
Re: Binäres Senden und Empfangen über die serielle Schnittst
Hi!
Ord() liefert dir den Wert des Characters als Zahl zwischen 0 und 255.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; begin I := Ord('+'); Caption := IntToStr(I); end; Zitat:
|
Re: Binäres Senden und Empfangen über die serielle Schnittst
Du kannst ein Byte über Chr(0-255) senden und dieses an deinem Zielgerät wieder zusammenbauen.
Ein Integer hat normalerweise 2 Bytes. Also zerlegst du die Zahl in 2 Bytes, sendest sie über Chr(XXX) + Chr(XXX) und baust die Bytes wieder zusammen. Wenn du als Antwort 2 Bytes bekommst kannst du sie über Ord() wieder in 2 Bytes (als Zahlen) umwandeln und dann das ganze wieder in einen Integer multiplizieren. Fertig Tobi |
Re: Binäres Senden und Empfangen über die serielle Schnittst
Hey Dani,
vielen Dank für die schnelle Antwort. Ich habe erstmal folgendes probiert und s geht super:
Delphi-Quellcode:
//Button Daten lesen und im Editfeld ausgeben
procedure TForm1.Button3Click(Sender: TObject); var I: integer; x: char; y: string; begin x := ApdComPort1.GetChar; //Empfangen von einem Byte (zum Test fest auf 43 gesetzt) Edit1.Text := x; //Hier wird das ASCII Zeichen '+' ausgegeben I := Ord(x); Edit2.Text := IntToStr(I);//Hier wird die Zahl 43 ausgegeben. end; @Tobi: Danke für diesen weitern Tip, werde ich auch noch ausprobieren. Grüsse, Johannes |
Re: Binäres Senden und Empfangen über die serielle Schnittst
ASCII ist in dem Sinne doch nur eine Darstellungsform. Du kannst doch deine Daten einfach als String zusammenbauen und auf einmal versenden - er sendet doch so oder so nur die Bytewerte. Ob ASCII oder der CharCode ist nur eine Frage der Darstellung.
Und ein Integer ist 4 Bytes gross (Siehe SizeOf(Integer)). |
Re: Binäres Senden und Empfangen über die serielle Schnittst
Ja,
aber ich muss ja nur ein Byte übertragen, das dann einem Spannungswert entspricht. Würde ich einen String übertragen bräuchte ich ja zum übertragen viel länger, weil ich pro Wert mehr als ein Byte senden müsste. Johannes |
Re: Binäres Senden und Empfangen über die serielle Schnittst
Zitat:
Mfg |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: Binäres Senden und Empfangen über die serielle Schnittst
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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-2025 by Thomas Breitkreuz