Forum: Mikrocontroller und Digitale Elektronik String in Hex umwandeln


von Maxim (Gast)


Lesenswert?

Hallo,


ich hoffe ihr könntet mich helfen!

Ich habe folgendes Problem. Ich habe einen String und möchte diesen in 
eine byte (0xAC) quasi (hexdezimal format)konvertieren.

Mit sprintf, printf,sscanf das geht aber da nutz mir nicht.

Auf PC Seite mag das bestimmt einwandfrei funktionieren, aber ich muss 
das auch auf Mikrocontroller-Seite verwenden und da kann ich mir die 
Konvertierung mit sscanf,printf nicht leisten.

Zum Hintergrund:

Ich möchte Hexwerte in Edit-Felder eingeben und diese als 
byte-basierendes Protokoll in einem COM(Serielle) weiter senden.

von Karl H. (kbuchegg)


Lesenswert?

Maxim schrieb:

> Ich möchte Hexwerte in Edit-Felder eingeben und diese als
> byte-basierendes Protokoll in einem COM(Serielle) weiter senden.

Na passt doch.
D.h. immer 2 char gehören zusammen und bilden 1 Hex-Ziffern.

D.h. du schreibst dir erst mal eine Funktion, die dir die Buchstaben 0 
bis 9, bzw. A bis F (gross- Kleinschreibung beachten) in die Zahlen 0 
bis 15 umsetzt.
1
uint8_t toBin( char Nibble )
2
{
3
  if( Nibble >= 'a' && Nibble <= 'f' )
4
    return Nibble - 'a' + 10;
5
 
6
  if( Nibble >= 'A' && Nibble <= 'F' ) )
7
    return Nibble - 'A' + 10;
8
9
  if( Nibble >= '0' && Nibble <= '9' )
10
    return Nibble - '0';
11
12
  return 0;
13
}

und damit ist es dann leicht aus 2 einzelnen Charactern, die du aus dem 
String rausholst, eine komplette Zahl zusammenzubauen
1
uint8_t byteToBin( char character1, char character2 )
2
{
3
  return toBin( character1 ) * 16 + character2;
4
}


Aus dem vom Benutzer eingegebenen String "A8", holst du dir die 
Character 'A' bzw. '8' raus, rufst byteToBin auf und von der Funktion 
kriegst du dann einen uint8_t mit genau dem Zahlenwert, der 0xA8 
entspricht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
1
  return toBin( character1 ) * 16 + character2;

Mach da besser
1
  return toBin( character1 ) * 16 + toBin( character2 );
draus ...

von Maxim (Gast)


Lesenswert?

Hi ich danke es euch
Ich probiere es das.

von wendelsberg (Gast)


Lesenswert?

Maxim schrieb:
> Ich möchte Hexwerte in Edit-Felder eingeben und diese als
> byte-basierendes Protokoll in einem COM(Serielle) weiter senden.

Wenn Du Dir klarmachst, welche Klimmzuege teilweise noetig werden, damit 
Du die Gueltigkeitspruefung perfekt bekommst, damit es keine Ueberlaeufe 
... gibt, kann es sein dass Du lieber den String weiterschickst.

wendelsberg

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Karl Heinz Buchegger schrieb:
>
1
>   return toBin( character1 ) * 16 + character2;
2
>
>
> Mach da besser
>
>
1
>   return toBin( character1 ) * 16 + toBin( character2 );
2
>
> draus ...

Danke

von Maxim (Gast)


Lesenswert?

Eine Frage bitte noch.

Von PC Seite lese ich das String als (String *) und möchte ich diese 
umgewandelte String (in Hexadezimal) als ersten mit einem Terminal 
Programm Testen (in einem andere PC).

Mit der Verbindung funktioniert als richtig nun leider nicht i 
gewünschte Form (Hexadezimal).

Die Daten sind immer als String.

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
Noch kein Account? Hier anmelden.