Hex Zahl als solche ausgeben

Gast #412200
Lesenswert?
• ▲
▼
Hallo,

Ich habe ein Unsigned Char welches eine Zahl zwischen 0 und 15
enthaelt.

Wenn ich diese nun über den UART ausgebe, erhalte ich nur die ersten 16
Sonderzeichen der Ascii Tabelle.
Wenn ich die Zahl mit 48 addieren wuerde, wuerden die Zahlen richtig
ausgegeben, aber die Hex Buchstaben nicht da in der Ascii Tabelle die
Buchstaben nicht direkt nach den Zahlen folgen.

Wie kann ich das einfach lösen?


Gruss

H:V
Gast #412202
Lesenswert?
• ▲
▼
Hallo,
also die Zahlen werden nacheinander im 8-Bit format Bit für Bit
übertragen. D.H. das ist Einstellungssache deines Terminalprogramms.

Beispiel:
Dezimal:   57
Binär:   0011 1001
Hexadez.:    39
ASCII:        9

Ich selbst kenne den Befehl nicht.
Ein Terminal, welches ich gerne nutze ist das von
http://www.docklight.de/
Bei diesem kann das Anzeigeformat eingestellt werden.
Gruß
#412203
Lesenswert?
• ▲
▼
snprintf wäre eine Möglichkeit. Das entsprechende Formatiersymbol
lautet %x
itoa (falls ist eine andere).

Oder aber du schreibst dir selbst was:

unsigned char HexNibble( unsigned char Nibble )
{
  if( Nibble > 10 )
    return Nibble - 10 + 'A';
  else
    return Nibble + '0';
}

void ToHex( unisgned char Number, char* Out )
{
  Out[0] = HexNibble( ( Number >> 4 ) & 0x0F );
  Out[1] = HexNibble( Number & 0x0F );
  Out[2] = '\0';
}

void main()
{
  char HexASCII[3];
  unsigned char i = 198;

  ToHex( i, HexASCII );

  ...
}
#412207
Lesenswert?
• ▲
▼
Ich habe noch eine andere Variante.
Gut zu erkennen: meine Vorliebe für Tabellen.
Der Nachteil beim AVR ist das leidige Verwenden von PROGMEM und
pgm_read_byte().
1
//*** Hex-Darstellung:
2
PROGMEM uint8_t hexval[] = "01234567890ABCDEF";
3

4
uint8_t* hex(uint8_t val, uint8_t *s){
5
  *s     = pgm_read_byte(hexval + ((val>>4) &0x0F));
6
  *(s+1) = pgm_read_byte(hexval + (val &0x0F));
7
  *(s+2) = 0;
8
  return(s);
9
}

Viel Spass, Stefan
Gast #412210
Lesenswert?
• ▲
▼
Ich würds lieber im Speicher lagern lassen, oder wieviele Zyklen frisst
ein Variablenzugriff per pgm_read_byte(pointer);?
Dann würde das dann so aussehen:

      //*** Hex-Darstellung:
      uint8_t* hex(uint8_t val, uint8_t *s)
      {
          static uint8_t hexval[] = "01234567890ABCDEF";
          *s = hexval[(val>>4) &0x0F];
          *(s+1) = hexval[val &0x0F];
          *(s+2) = 0;
          return(s);
      }

Ist natürlich nur interesannt wenn diese Hexausgabe nicht lange dauern
darf und mehr als wie nur so 8 Bytes umgewandelt werden müssen.
Am C64 Coden üben zahlt sich aus, so ähnlich würde das bei mir auch in
ASM aussehen zwecks Geschwindigkeitsgründen ;)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.