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
charData[]={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[anStellex];
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!
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
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.
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!
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 '?'
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.
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.
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.
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.
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?
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"...
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.