Ich habe ein Bitfeld, mit lauter binären Werten bestimmt. struct { unsigned char 3_3V:1; unsigned char 5V:1; unsigned char 12V:1; unsigned char _12V:1; unsigned char STDBY:1; unsigned char TEMP_Lueft:1; unsigned char OK:1; unsigned char no_sysFail:1; } Status_Request; Es gibt doch bestimmt eine schlaue Funktion, die mir daraus den entsprechenden hex Wert berechnet. Danke schon mal
Nimm ne union. union Convert { struct Leider_hast_du_der_struct_keinen_Namen_gegeben Status; unsigned char Value; } union Convert tmp; tmp.Status = Status_Request; unsigned char i = tmp.Value; Wenn ich mirs recht überlege, könnte das auch mit einem simplen cast gehen: unsigned char i = (unsigned char)Status_Request; schlimmstenfalls müsste man machen: unsigned char i = *(unsigned char*)&Status_Request; Oder du könntest überhaupt deine struct verändern: struct { union { unsigned char AllBits; struct { unsigned char 3_3V:1; unsigned char 5V:1; unsigned char 12V:1; unsigned char _12V:1; unsigned char STDBY:1; unsigned char TEMP_Lueft:1; unsigned char OK:1; unsigned char no_sysFail:1; } } Status_Request; dann kannst du über STDBY etc. die einzelnen Bits setzten und über AllBits kannst du auf alle Bits gemeinsam zugreifen. Der Möglichkeiten sind da viele. Nur eines noch: Einen Variablennamen ala 5V oder 12V wird der der Compiler nicht akzeptieren. Namen von Variablen können nicht mit einer Ziffer beginnen.
Ooops. Da hab ich wohl eine schliessende } vergessen. Sah gleich so seltsam aus: struct { union { unsigned char AllBits; struct { unsigned char 3_3V:1; unsigned char 5V:1; unsigned char 12V:1; unsigned char _12V:1; unsigned char STDBY:1; unsigned char TEMP_Lueft:1; unsigned char OK:1; unsigned char no_sysFail:1; } } } Status_Request;
Danke, für die ausführliche Auswahl, werds gleich mal probieren. Das Variablen Namen Problem hab ich schon behoben. Danke
Ich hab doch noch mal ne Frage! Ich brauche "AllBits" in Hex, also wenn vorher 0101 1100 brauch ich die Binärzahl als Hex, dementsprechend hier 5C. Wo, oder mit was wird das bei deinen Vorschlägen gewandelt? Vielleicht bin ich auch nur zu kurzsichtig um es zu sehen, dann sorry.
Definiere ,,in Hex''. Willst du es auf einer UART ausgeben? Dann brauchst du einen String und eine Routine, die dir eine interne (Binär-)Zahl in einen String umwandelt, z. B. itoa() oder sprintf(). Oder was soll sonst damit passieren?
Genau, das habe ich vor, das Ganze soll über den UART ausgegeben werden. Das Ausgabeformat, ist schon fest, daher in hex.
Ja, dann halt nach itoa() oder sprintf() gucken im Manual. sprintf() kann das auf jeden Fall [sprintf(buf, "%02x", i);], ist nur die Frage, ob du den Code-Overhead tolerieren kannst, da es eine eierlegende Wollmilchsau ist.
Was ist denn Code-Overhead? Also den Beschreibungen nach, müsste es auch mit ITOA() gehen. Ich werds mal mit itoa() probieren. Allerdings muss ich dann mein Bitfeld von char in int abändern, damit es mir itoa() in einen String im Hex Zahlensystem wandeln kann. Danke für deine Hilfe
ITOA() gibt es nicht. C ist case sensitive. Das Problem von itoa() ist nur, dass du keine Vornullen direkt ausgegeben bekommst, das müsstest du dir mit der Hand dran stricken. > Allerdings muss ich dann mein Bitfeld von char in int abändern, > damit es mir itoa() in einen String im Hex Zahlensystem wandeln > kann. Wie kommst du darauf? Hast du die Parameterübergabe von C nicht verstanden? Allerdings sollte der "char" wohl "unsigned char" sein, damit du nicht in sign extension Probleme rennst, oder gleich "uint8_t" (Definition steht in <stdint.h>, C99 genormt). Außerdem besser utoa() benutzen oder den Wert erst nach (unsigned int) casten. > Was ist denn Code-Overhead? Die Codegröße, die sprintf() mit sich herumschleppt, da es eben alles Mögliche und Unmögliche konvertieren kann. (Lediglich Gleitkomma ist in der Standardversion weggelassen.) Ist also einfach eine Frage, wie viel Platz du im ROM übrig hast. sprintf() ist die Rundum-Sorglos-Version, da es alle Dinge wie führende Nullen, Hexziffern wahlweise in Groß- oder Kleinbuchstaben etc. pp. erledigt. Wenn ich Platz im ROM habe, würde ich dem stets den Vorzug vor einer do-it-yourself-Lösung geben. Denk dran, ROM sparen ist gut und schön, aber Atmel gibt dir nichts zurück, wenn du von 16 KB ROM nur 12 KB benutzt. ;-)
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.