AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Binäres Senden und Empfangen über die serielle Schnittstelle
Thema durchsuchen
Ansicht
Themen-Optionen

Binäres Senden und Empfangen über die serielle Schnittstelle

Ein Thema von Schmandi · begonnen am 21. Feb 2007 · letzter Beitrag vom 21. Feb 2007
Antwort Antwort
Schmandi

Registriert seit: 21. Feb 2007
3 Beiträge
 
#1

Binäres Senden und Empfangen über die serielle Schnittstelle

  Alt 21. Feb 2007, 12:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 21. Feb 2007, 12:21
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?
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 21. Feb 2007, 12:29
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
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Schmandi

Registriert seit: 21. Feb 2007
3 Beiträge
 
#4

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

  Alt 21. Feb 2007, 12:53
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

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

  Alt 21. Feb 2007, 13:03
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)).
  Mit Zitat antworten Zitat
Schmandi

Registriert seit: 21. Feb 2007
3 Beiträge
 
#6

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

  Alt 21. Feb 2007, 13:11
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
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 21. Feb 2007, 13:16
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
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
21. Feb 2007, 13:53
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 21. Feb 2007, 13:54
Zitat von EDatabaseError:
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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