Hex in Array einlesen und als Charakter erkennen.

OP #1564649
Lesenswert?

Hallo Leute!

Ich habe jetzt folgendes heikles Problem:

Ich möchte über eine Software einen Hex Wert einlesen, beispielsweise 
den Wert F, welcher eben als Hexadezimalwert fungiert, also 1111bin.

Dieser Wert soll über eine getCharakter Funktion eingelesen werden, und 
in ein Feld des Arrays gespeichert werden (z.B. array [0] = getchar(); )

Nun speichere ich aber nur 4 Bit in das Feld...
Erste Frage, wie wird das Feld ausgefüllt? Mit 00001111? Was mir eben am 
logischsten erscheinen würde, da ich die höherwertigeren Bits ja in dem 
Sinne nicht beschreibe.

Und im Endeffekt habe ich eben das Problem, dass ein Hex Wert "F" im µC 
als Charakterwert F erkennt werden soll, obwohl der eigentliche 
Dezimalwert nicht übereinstimmt...

Jemand eine Idee?

Liebe Grüße
Gast #1564658
Lesenswert?

Für die Notation von Zahlen (sog. Literale) gibt es in C Konventionen 
(sowie das nicht-standard-gemässe 0bxxxxxx in gcc). Wenn Du Deine Frage 
unter Verwendung dieser Notationen neu formulierst, gibst Du Dir selbst 
schon die Antwort.
OP #1564709
Lesenswert?

Grrrr schrieb:
> Wenn Du Deine Frage
> unter Verwendung dieser Notationen neu formulierst, gibst Du Dir selbst
> schon die Antwort.

Könntest du mir mal nen ordentlichen Google Link geben? Vllt hast ja 
einen im Gedächtnis.... Wäre dir dafür sehr dankbar, möcht hier auch 
nicht nur herumfragen, sondern mich selber darin einlesen :-)
#1564748
Lesenswert?

Deine Fragestellung ist sehr verworren.
Deine eigentliche Aufgabenstellung geht da nicht wirklich daraus hervor.

Aber ich vermute einfach mal, dass du im Grunde einfach nur eine 
Codiertabelle suchst. Du gehst mit dem Binärwert in die Tabelle und 
erhältst als Ergebnis den Character, der dem Index (der Zahl) 
enstpricht.

Wozu du da das von dir angedachte Feld benötigst ist nicht wirklich klar

char Codes[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };


 unsigned char Wert;
 char          Character;

 Wert = PINB;   // zb vom Port B einlesen
 Character = Codes[ Wert & 0x0F ];


das wäre zb eine Möglichkeit. Es gibt auch noch andere ...
... wenn, ja wenn ich deine Frage richtig erraten habe.

Und ja, du solltest tatsächlich ein Buch lesen.
OP #1564753
Lesenswert?

Karl heinz Buchegger schrieb:
> Und ja, du solltest tatsächlich ein Buch lesen.

Habe ich schon gemacht, jedoch war das in einer Ecke gelegene Buch etwas 
verstaubt und ein großteil von den Seiten war schon von Buchwürmern 
zerfressen.
Werde mir in den nächsten Tagen ein neues kaufen, frisch gedruckt, und 
wohlriechend nach Druckerschwärze...
OP #1564768
Lesenswert?

Karl heinz Buchegger schrieb:
> Deine Fragestellung ist sehr verworren.
> Deine eigentliche Aufgabenstellung geht da nicht wirklich daraus hervor.
>
> Aber ich vermute einfach mal, dass du im Grunde einfach nur eine
> Codiertabelle suchst. Du gehst mit dem Binärwert in die Tabelle und
> erhältst als Ergebnis den Character, der dem Index (der Zahl)
> enstpricht.
>
> Wozu du da das von dir angedachte Feld benötigst ist nicht wirklich klar
>
> char Codes[] = { '0', '1', '2', '3', '4', '5', '6', '7',
>                  '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
>
>
>  unsigned char Wert;
>  char          Character;
>
>  Wert = PINB;   // zb vom Port B einlesen
>  Character = Codes[ Wert & 0x0F ];
>
>
> das wäre zb eine Möglichkeit. Es gibt auch noch andere ...
> ... wenn, ja wenn ich deine Frage richtig erraten habe.
>
> Und ja, du solltest tatsächlich ein Buch lesen.

Edit:

Versuche mich jetzt nochmal auszudrücken:

Ich lese über dir RS232 einen Hexwert ein, und speichere diesen Wert in 
ein Feld. Gut.
Jetzt möchte ich aber den Hexwert "F" eben so erkennen, damit er dem 
Charakter "F" entspricht, also 46hex.
Das Gleiche soll bei einem A passieren.
In das Feld wird der Wert 1010bin geschrieben, jedoch soll dieser Wert 
als Character A erkennt werden, eben 41hex.

Ich hoffe, ich konnte mich verständlicher ausdrücken, ansonsten bin ich 
für Beleidigungen gerne offen ;-P
Gast #1564841
Lesenswert?

>Ich lese über dir RS232 einen Hexwert ein

Nein, einen Binärwert (z.B. 0100 1011). Um eine Hex-Darstellung zu
erreichen, mußt Du jedes Nibble in die entsprechende Hexadezimalzahl
umwandeln. Beim High-Nibble genügt es 30h zu addieren, um die Zahl 4 zu
erhalten (ASCII-Code 34h). Und beim Low-Nibble...
Aber das kannst Du Dir jetzt selber ausdenken.
Gast #1565033
Lesenswert?

Du möchtest scheinbar aus dem Nichts erahnen was ich einlese?
Ich weiß, dass es Hexadezimalzahl ist

Okay, wenn ich über den Interrupt immer 8 Bit einlese, sprich einen 
Character sieht die Sache natürlich anders aus... Ich habe eher gedacht, 
dass der µC nachdem er die vier Bit bekommt, auf keine weiteren mehr 
wartet, weil diese nicht in einem Frame gesendet werden.
Werde mir deine Vorschläge mal zu Gemüte ziehen, danke.
#1565048
Lesenswert?

Die meisten UARTs lassen sich auf 5..9 Bits einstellen, 4 Bit geht also 
nicht.

5Bit hat man früher mal für Fernschreiber verwendet (Ratterkisten, die 
Lochstreifen ausspuckten).

Bei RS232 sind 8Bit das gängige Format und bei RS485 9Bit (zur 
Adressierung).


Peter
Gast #1565083
Lesenswert?

>Du möchtest scheinbar aus dem Nichts erahnen was ich einlese?
>Ich weiß, dass es Hexadezimalzahl ist

Der war gut!
Da mußte ich heute früh schon einmal herzhaft lachen.
Es scheint, daß Du nicht nur ein Buch über C lesen mußt.

Noch ein Hinweis: Umwandlungszeichen für printf ansehen, z.B. " %X ".
Gast #1565255
Lesenswert?

Tja, vielleicht bin ich nicht ein perfekter Mikrocontroller Moderator, 
aber ums nochmal kurz zu halten. Daten kommen daher, Daten sind (wie ich 
jetzt weiß) zwei Hexwerte, also 8 Bit. Diese Acht Bit (zb FFhex)gehören 
gesplittet und somit einzeln als zwei Character erkannt: eben die 
Character F und F. Ich hoffe, den hohen Anforderungen dieses Forums 
gerecht zu werden, ansonsten gibt es auch noch andere Foren wie 
Planet-Liebe, worin ich euch vllt auch so anschnautzen könnte ;-)
#1565256
Lesenswert?

Johnny Knot schrieb:
> Tja, vielleicht bin ich nicht ein perfekter Mikrocontroller Moderator,
> aber ums nochmal kurz zu halten. Daten kommen daher, Daten sind (wie ich
> jetzt weiß) zwei Hexwerte, also 8 Bit. Diese Acht Bit (zb FFhex)gehören
> gesplittet und somit einzeln als zwei Character erkannt: eben die
> Character F und F. Ich hoffe, den hohen Anforderungen dieses Forums
> gerecht zu werden, ansonsten gibt es auch noch andere Foren wie
> Planet-Liebe, worin ich euch vllt auch so anschnautzen könnte ;-)

Dann tu das doch bitte.
Von nichts eine Ahnung, noch nicht mal sein Problem vernünftig 
beschreiben können (mit jedem Posting verändert sich die 
Aufgabenstellung) und dann auch noch eine große Lippe riskieren. Das 
geht vielleicht bei DSDS aber nicht hier.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren