Hi, ich möchte eine Integer Variable als 4 stelligen Hex-Wert über die UART ausgeben. Wie programmiere ich das am Besten in c?
1 | char puffer[5]; |
2 | snprintf( puffer, 4, "%04X", meinWert ); |
3 | // dann puffer ausgeben...
|
oder itoa() bzw. utoa() verwenden, und die Stellenanzahl von Hand hinbiegen.
Zumindest ist das der übliche Weg. Man könnte auch die UART zur Standardausgabe machen, dann kann man ohne Umweg über einen Puffer direkt z.B. mit printf() schreiben.
Danke! Wie könnte ich es mit itoa() machen? Wäre das schneller, oder besser?
Die printf-Funktionen brauchen viel Code und sind relativ langsam. Jens schrieb: > Wie könnte ich es mit itoa() machen? Wäre das schneller, oder besser? Doku lesen: http://www.nongnu.org/avr-libc/user-manual/index.html itoa() liefert soviele Stellen, wie nötig. Ggf. musst du halt auf deine 4 Stellen auffüllen. Dafür ist itoa() sehr sparsam im Vergleich zu snprintf(). Wenn du in deinem Programm aber eh die printf-Dinger brauchst, kannst du sie hier auch gleich verwenden. Von der zweiten Verwendung an blähen sie das Programm ja nicht mehr weiter auf
Wahrscheinlich brauchst du aber eher utoa(), weil ich bei "hex" erstmal von unsigned ausgehe. itoa() ist für signed.
Klaus Wachtler schrieb: > itoa() liefert soviele Stellen, wie nötig. Andersrum formuliert: Keine führenden Nullen.
Hallo, könnte wer von euch mal drüberschauen, ob der Code so in Ordnung ist? DANKE! Gegeben Integervariable value;
1 | unsigned int valueL, valueH; |
2 | unsigned char nibble1; |
3 | unsigned char nibble2; |
4 | unsigned char nibble3; |
5 | unsigned char nibble4; |
6 | unsigned char hextable[] = { '0','1','2'. |
7 | '3','4','5'. |
8 | '6','7','8', |
9 | '9','A','B', |
10 | 'D'.'E','F', }; |
11 | |
12 | valueL = value; |
13 | valueH = value >> 8; |
14 | |
15 | |
16 | nibble1 = hextable[ ( valueH & 0xF0 ) >> 4) ]; |
17 | nibble2 = hextable[ ( valueH & 0x0F) ]; |
18 | nibble3 = hextable[ ( valueL & 0xF0 ) >> 4) ]; |
19 | nibble4 = hextable[ ( valueL & 0x0F) ]; |
20 | |
21 | putchar(nibble1); putchar(nibble2);putchar(nibble3); putchar(nibble4); |
Da nibbleX und hextable[] Zeichen enthalten, sollten sie vom Typ char (nur char, kein signed/unsigned) sein. Und es ist besser erst zu verschieben und dann zu maskieren.
Wenn man um 4 nach rechts schiebt, braucht man vorher nicht zu maskieren. Kompilierbar ist es eh nicht, alleine wegen der Punkte in der Tabelle.
irgendwo hatte ich sowas gefunden:
1 | unsigned char nibble; |
2 | unsigned char hex0,hex1; |
3 | |
4 | nibble = (data & 0xf0) >> 4; |
5 | hex0 = (nibble < 10) ? ('0' + nibble) : ('a' + nibble - 10); |
6 | |
7 | nibble = (data & 0x0f); |
8 | hex1 = (nibble < 10) ? ('0' + nibble) : ('a' + nibble - 10); |
Holger edit: auch hier könnte das erste maskieren entfallen
Jens schrieb: > unsigned char hextable[] = { '0','1','2'. > '3','4','5'. > '6','7','8', > '9','A','B', > 'D'.'E','F', }; Wo ist 'C' ??? Gruss Stefan
Das ist alles C. Wenn es vom C-Compiler ohne Fehler übersetzt wird, ist es C. :-)
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.