mikrocontroller.net

Forum: Compiler & IDEs Int Zahl in Hex umwandeln und in String konvertieren


Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte eine Integer Zahl nach Hex umwandeln, und das Ergebnis als 
String über UART übertragen.

z.B. die Zahl 2000 = 0x7D0 = "7D0"

Ich möchte also die "7D0" als String haben. Wie schafft man das? Auf 
externe Funktionen möchte ich wegen zu wenig Programmspeicher 
verzichten.

Danke!

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundlagen in C!!

[c]
int a=2000;
char puffer[10];

sprintf(puffer,"%x",a);


/c]

Autor: Wolfgang M. (womai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist eine Loesung ohne sprintf (code nicht getestet!); sprintf 
braucht ueblicherweise Unmengen Programmspeicher, weil's eben eine sehr 
flexible Funktion ist (MikroC z.B. verbraucht ca. 2 KB 
Programmspeicher). Manche compiler haben auch abgespeckte versionen. Der 
folgende Code sollte bloss ein paar Byte Assembler erzeugen:

unsigned long my_val = 2000;
signed int i;
char digit;

for (i = 28; i >= 0; i -= 4)
{
    digit = (my_val >> i) & 0x0000000f; // eine hex-Stelle extrahieren
    digit = (digit > 9) ? digit + '0' : digit + 'A' - 10; // in 
ASCII-Zeichen konvertieren
    send_char (digit); // oder was immer die UART-Funktion in Deinem 
compiler ist
}


Wolfgang

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang M. wrote:

> Hier ist eine Loesung (code nicht getestet!):
> ...
>     digit = (digit > 9) ? digit + '0' : digit + 'A' - 10; // in
> ASCII-Zeichen konvertieren

If und else sind vertauscht.

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!! Was bedeutet die Zahl 28 in der For-schleife?

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> If und else sind vertauscht.
Stefan, wie ist es also richtig?

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert leider nicht... :( Wo ist der Fehler?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FrageMan, du bist ja mal ein ganz Sparsamer. Schreibst nicht so gern, 
oder ;-)

Wenn du erzählst, wie du was probiert hast und was dann nicht 
funktioniert hat, dann kann/mag man dir vielleicht helfen.

Der if/else Fall sollte so aussehen:
digit = (digit > 9) ? digit + 'A' - 10 : digit + '0';

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht mal die Operanden des ternären Operators richtig klammern...
digit = (digit > 9) ? (digit + 'A' - 10) : (digit + '0');
Hab jetzt die Prioritäten nicht im Kopf, aber sicher ist sicher.

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JETZT FUNKTIONIERT!!! SUPER DANKE!!!

Autor: Wolfgang M. (womai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, if und else waren vertauscht. Gottseidank habe ich ja geschrieben 
"nicht getestet"; ausserdem war das natuerlich Absicht, um zu sehen, ob 
wer mitdenkt :-)

Die 28 kommt daher, dass unsigned long 32 Bits hat - d.h.. bits 0 bis 
31. Mein Code klaubt 4 Bits auf einmal heraus und macht daraus eine 
Hex-Ziffer. Und die hoechstwertigen bits sind bits 28 bis 31.

Wolfgang

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.