Forum: Mikrocontroller und Digitale Elektronik AT90USB: HEX-Zeichen via UART senden


von AVRBeginner (Gast)


Lesenswert?

Hallo,

momentan wage ich den Start in die AVR-Welt und spiele gerade ein 
bisschen mit UART herum.

Mein Empfänger erwartet ein Reihe von HEX-Werten, z.B. "073F2B...".

Diese habe ich in einem char-Array gespeichert, welches so aussieht:
1
char Data[]={0x07, 0x3F, 0x2B, ...};

Dieses Array sende ich nun Zeichen für Zeichen über UART raus.

Nun habe ich eine eher allgemeine Verstädnisfrage: Wenn ich nun
1
UDR1 = Data[an Stelle x];
sende, was genau kommt dann bei der Gegenseite an? Es werden doch vom 
UART ASCII-Zeichen gesendet, oder? Beziehungsweise die Frage 
andersherum: Was muss ich senden, damit beim Empfänger beispielsweise 
"3F" ankommt?

Danke für die Hilfe!

von Timmo H. (masterfx)


Lesenswert?

AVRBeginner schrieb:
> Beziehungsweise die Frage
> andersherum: Was muss ich senden, damit beim Empfänger beispielsweise
> "3F" ankommt?
>
> Danke für die Hilfe!
0x3f
Das was du ins udr schreibst wird 1:1 gesendet

von holger (Gast)


Lesenswert?

>Es werden doch vom UART ASCII-Zeichen gesendet, oder?

Nein.

Wenn du "3F" willst musst du zwei Zeichen senden.
'3' und 'F'.

von H.Joachim S. (crazyhorse)


Lesenswert?

ich nehm mal, es erwartet eher ASCII-Zeichen..
Dafür gibts mehrere Lösungsmöglichkeiten.

von Klaus Dieter (Gast)


Lesenswert?

holger schrieb:
> Nein.
>
> Wenn du "3F" willst musst du zwei Zeichen senden.
> '3' und 'F'.

Blödsinn. Die UART sendet (in der "normalen" Konfiguration) 8 Datenbits. 
Sprich, wenn du 0x3F sendest, schickt sie auf Bitebene 00111111. Sie 
interessiert sich nicht für Formatierungen, wenn du einen Hex-Wert ins 
UDR schiebst, wird dieser gesendet.

von H.Joachim S. (crazyhorse)


Lesenswert?

es kann aber sein, dass der Empänger 0x3f als
0x33 -> '3'
0x45 -> 'F'
erwartet :-)

von AVRBeginner (Gast)


Lesenswert?

Wow...das geht ja rasend schnell hier. Vielen Dank für eure schnellen 
Antworten!

Ok, dann war meine Sorge also unberechtigt, dass er z.B. "3F" als 
hex-codiertes ASCII interpretiert und beim Empfänger somit ein "?" 
ankommt.

Ich kann mein Array also senden wie es ist und es kommt auf der anderen 
Seite "073F2B" an.

Vielen Dank!

von Maxx (Gast)


Lesenswert?

Klaus Dieter schrieb:
> Sie
> interessiert sich nicht für Formatierungen, wenn du einen Hex-Wert ins
> UDR schiebst, wird dieser gesendet.

Aber der Empfänger machts, denn der scheinbaren Unerfahrenheit des 
Fragestellers ist zu erwarten, dass dort ein Terminalprogramm sitzt, 
welches die ASCII Interpretation ausgibt und das ist bei 0x3F nicht "3F" 
sondern '?'

von AVRBeginner (Gast)


Lesenswert?

H.joachim Seifert schrieb:
> es kann aber sein, dass der Empänger 0x3f als
> 0x33 -> '3'
> 0x45 -> 'F'
> erwartet :-)

Danke für den Hinweis, das tut er aber nicht. Er erwartet die Hex-Werte 
byteweise und verarbeitet die dann auch so weiter.

von AVRBeginner (Gast)


Lesenswert?

Maxx schrieb:
> Klaus Dieter schrieb:
>> Sie
>> interessiert sich nicht für Formatierungen, wenn du einen Hex-Wert ins
>> UDR schiebst, wird dieser gesendet.
>
> Aber der Empfänger machts, denn der scheinbaren Unerfahrenheit des
> Fragestellers ist zu erwarten, dass dort ein Terminalprogramm sitzt,
> welches die ASCII Interpretation ausgibt und das ist bei 0x3F nicht "3F"
> sondern '?'

Nein nein, kein Terminalprogramm. Empfänger ist ebenfalls eine Hardware 
und diese erwartet tatsächlich byteweise die HEX-Werte.

von H.Joachim S. (crazyhorse)


Lesenswert?

AVRBeginner schrieb:
> Wow...das geht ja rasend schnell hier. Vielen Dank für eure schnellen
> Antworten!

Nur Wunder dauern länger :-)

von Programmierer (Gast)


Lesenswert?

Blödsinn. Wenn du den String "3F" übermitteln willst, musst du die 
Zeichen '3' und 'F' übermitteln. Die Uart interessiert sich nicht für 
"hex-Werte", bloss Menschen. Die interessieren sich auch für eine 
Zeichenrepräsentation wie ascii.

von Maxx (Gast)


Lesenswert?

AVRBeginner

Nur damit wir alle von dem gleichen reden (und dazu empfiehlt sich ein 
gute Lehrbuch als erstes.

0x3F, 63 und '?' sind identisch. Es gibt keinen Unterschied ausser in 
der Schreibweise, wie ich/du dich ausdrückst. Der Wert, also die 
physikalischen Bits auf deinem Microcontroller sind die gleichen.

"3F" ist ein String, die Verkettung von '3', 'F' und der Terminierung 
'\0', also gleich der Verkettung von 0x33, 0x46 und 0x00

Dann reden wir auch in Zukunft nicht aneinander vorbei.

von AVRBeginner (Gast)


Lesenswert?

Maxx schrieb:
> "3F" ist ein String, die Verkettung von '3', 'F' und der Terminierung
> '\0', also gleich der Verkettung von 0x33, 0x46 und 0x00

Das heißt doch dann aber für mich, dass ich das eben nicht als ein 
einziges Zeichen senden kann, oder? Wenn ich aber "0x33" und dann "0x46" 
sende, dann bedeutet das doch etwas anderes?

Binär ausgedrückt möchte ich dem Empfänger das Byte "0011 1111" senden. 
Und das ist ja etwas anderes als "0011 0011" und dann "0100 0110" 
hinterher? Oder stehe ich gerade komplett auf der Leitung?

von Maxx (Gast)


Lesenswert?

Lass die "" Weg. 0x33 und "0x33" sind nicht das gleiche!
Mit der Information lese die Posts auch der anderen nochmal.

von AVRBeginner (Gast)


Lesenswert?

Ok, ich glaube ich habe verstanden. Wenn ich es zudem auch noch richtig 
verstanden habe, dann müsste das Senden des chars 0x3F genau das 
bewirken, was ich möchte, da der Empfänger keinen String oder ähnliches 
erwartet, sondern hexadezimal codierte einzelne Bytes. Empfänger möchte 
das Byte "0011 1111", nur eben hex-codiert und nicht binär.

Ich glaube, man denkt einfach zu "menschlich"...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

AVRBeginner schrieb:
> da der Empfänger keinen String oder ähnliches
> erwartet, sondern hexadezimal codierte einzelne Bytes. Empfänger möchte
> das Byte "0011 1111", nur eben hex-codiert und nicht binär.

Nein. Der Empfänger erwartet einzelne Bytes. Gar nicht codiert.

Vor allem: Ein Byte ist ein Byte; es gibt keine "hex-codierten" oder 
"binären" Bytes.

Die Codierung ist nur eine Darstellungsform, die dafür da ist, daß 
Menschen die Bytes lesen können. Und da kann ein und dasselbe Byte 
völlig unterschiedlich interpretiert werden, es bleibt das gleiche.

0x42, 66, 'B', 0b01000010, 0102 -- das ist alles das gleiche, nur mal in 
hexadezimaler, dezimaler, ASCII, binärer und oktaler Darstellung.

Wenn man aber über die Bytes redet, ist es wichtig, damit man sich 
versteht, das Darstellungssystem bekanntzugeben.

Das vorangestellte 0x kennzeichnet eine hexadezimale Darstellung, 
einfache Hochkommata kennzeichnen die ASCII-Variante, ein 
vorangestelltes 0b eine binäre Darstellung, eine führende Null die 
oktale Darstellung (Vorsicht!) und einfach nur so eine Zahl ist i.d.R. 
dezimal.

Und wenn eine Zeichenfolge in Anführungszeichen steht, also "01000010", 
dann ist dem Eingeweihten klar, daß das nicht ein einzelnes Byte, 
sondern eine Zeichenkette aus 8 Bytes (oder, wenn es um die 
Repräsentation im Arbeitsspeicher eines C-Programmes geht, sogar 9 
Bytes) ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.