Forum: Mikrocontroller und Digitale Elektronik Hex in Array einlesen und als Charakter erkennen.


von Johnny K. (johnny_knoxville)


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

von Grrrr (Gast)


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.

von Marcus O. (marcus6100)


Lesenswert?

Lies mal ein Buch über C Programmierung.

von Johnny K. (johnny_knoxville)


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

von Johnny K. (johnny_knoxville)


Lesenswert?

Marcus Overhagen schrieb:
> Lies mal ein Buch über C Programmierung.

Leicht zu sagen ;-)

von Karl H. (kbuchegg)


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.

von Johnny K. (johnny_knoxville)


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

von Johnny K. (johnny_knoxville)


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

von Georg (Gast)


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.

von Johnny Knot (johnny_knoxville) (Gast)


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.

von Peter D. (peda)


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

von Georg (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Johnny Knot (johnny_knoxville) schrieb:
> Du möchtest scheinbar aus dem Nichts erahnen was ich einlese?

Nein, wir raten nur und benutzen gedanklich die gängisten Varianten.
Von dir kommt ja keine brauchbare Information.

von Johnny Knot (Gast)


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

von Karl H. (kbuchegg)


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.

von Georg (Gast)


Lesenswert?

Got sei Dank, endlich einmal klare Worte an diesen selbsternannten
"Software-Guru".

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.