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
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.
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 :-)
Marcus Overhagen schrieb:
> Lies mal ein Buch über C Programmierung.
Leicht zu sagen ;-)
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.
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...
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
>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.
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.
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
>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 ".
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.
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 ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.