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.
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.
Karl Heinz Buchegger schrieb:
1 | return toBin( character1 ) * 16 + character2; |
Mach da besser
1 | return toBin( character1 ) * 16 + toBin( character2 ); |
draus ...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.