Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Binäres Senden und Empfangen über die serielle Schnittstelle (https://www.delphipraxis.net/86938-binaeres-senden-und-empfangen-ueber-die-serielle-schnittstelle.html)

Schmandi 21. Feb 2007 12:12


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

Dani 21. Feb 2007 12:21

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:

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)
Wie meinst du das? Musst du einzelne Bits über die Schnittstelle senden?

EDatabaseError 21. Feb 2007 12:29

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

Schmandi 21. Feb 2007 12:53

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

Muetze1 21. Feb 2007 13:03

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)).

Schmandi 21. Feb 2007 13:11

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

EDatabaseError 21. Feb 2007 13:16

Re: Binäres Senden und Empfangen über die serielle Schnittst
 
Zitat:

Zitat von Muetze1
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)).

Kommt drauf an wo ;-) am PC vielleicht. An meinem µC hat ein Integer 2 Bytes...jedenfalls laut Hilfe.

Mfg

DP-Maintenance 21. Feb 2007 13:53

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

SirThornberry 21. Feb 2007 13:54

Re: Binäres Senden und Empfangen über die serielle Schnittst
 
Zitat:

Zitat von EDatabaseError
Zitat:

Zitat von Muetze1
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)).

Kommt drauf an wo ;-) am PC vielleicht. An meinem µC hat ein Integer 2 Bytes...jedenfalls laut Hilfe.

Mfg

Da es aber eine Delphi-Frage war, explizit Delphi6 ist klar das es sich um einen 32Bit-Delphicompiler handelt wo ein Integer 32 bit = 4 Byte groß ist


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