String zerlegen und Werte umwandeln

OP #3424123
Lesenswert?
• ▲
▼
Hallo Leute,
ich habe mal wieder ein Problem und zwar bekomme ich von der seriellen 
Schnittstelle einen ASCII String geschickt:
oui $00 $1C 3<\n><\r> (HEX:6F 75 69 20 24 30 30 20 24 31 43 20 33 0A 0D)

Bei diesem möchte ich den Wert nach dem ersten $, also 00 nach dem 
zweiten $ also 1C und den Wert dahinter in eine eigene Variable 
speichern. Das heißt ich muss den String erstmal zerlegen und dann die 
ASCII Werte in ein Byte umwandeln, also die zwei Byte 0 0 müssen in ein 
Byte welches dann den Wert 0 hat. Ich scheitere aber erstmal an der 
ersten Sache. Ich habe über Strtok gelesen aber da wird immer mit printf 
gearbeitet und ich weis nicht wie ich die Werte in eine Variable 
bekomme. Vielleicht muss man auch alles gleichzeitig machen da ja immer 
zwei empfangene Bytes zu einem konvertiert werden müssen.
Kann mir da jemand helfen?
Was ich schon habe ist, dass er mir in den Variablen jeweils das erste 
Zeichen abspeichert.
Hier mal der Code:
1
char str[] = "oui $10 $1C 3<\n><\r>";
2

3
  char *KO,*FLAG,*WERT = NULL;
4
  uint8_t i = 0;
5
  //dummy = UDR1;
6
  char trennzeichen[]="$";
7

8
  KO = strtok(str,trennzeichen);
9
  FLAG = strtok(NULL,trennzeichen);
10
  WERT = strtok(NULL,trennzeichen);
11
  USART_Transmit(*KO); //K
12
  USART_Transmit(*FLAG); //K
13
  USART_Transmit(*WERT); //K
Nach ausführen bekomme ich die Chars o 1 1 also das ist schonmal gut 
denke ich, jetzt soll aber in den Variablen nicht 1 also 0x31 sondern 
eben 0x10 und 0x1C drin stehen. da der ASCII string eben Bytes 
repräsentiert.
Wie bekomm ich das noch rein?
Grüße Christian
#3424187
Lesenswert?
• ▲
▼
Chris tian schrieb:

> char str[] = "oui $10 $1C 3<\n><\r>";

strtok könnte man nehmen, ich denke aber, dass es hier mit strchr 
einfacher ist, die gewünschte Information zu extrahieren.

mittels strchr nach dem '$' suchen lassen. Du kriegst einen Pointer 
zurück, wo das '$' das erste mal zu finden ist, die beiden Zeichen nach 
dem $ sind dann deine Hex-Ziffern, die nach bewährtem Muster zur 
eigentlichen Zahl zusammengesetzt werden.

Den Pointer, den du von strchr kriegst (wenn er nicht 0 ist), kannst du 
dann um 1 erhöht für einen weiteren strchr benutzen. Bzw. durch das 
Auslesen der Hex-Ziffern hast du dann sowieso schon automatisch einen 
Pointer, den du für den nächsten strchr benutzen kannst.

mal als Skizze:
1
char str[] = "oui $10 $1C 3<\n><\r>"
2
char* found;
3

4
   ...
5

6
  found = strchr( str, '$' );
7
  if( found )
8
  {
9
    found++;
10
    first = toHex( *found++ ) * 16;
11
    first += toHex( *found++ );
12

13
    found = strchr( found, '$' );
14
    if( found )
15
    {
16
      found++;
17
      scnd = toHex( *found++ ) * 16;
18
      scnd += toHex( *found++ );
19
    }
20
  }
21

22
...
23
uint8_t toHex( char c )
24
{
25
  if( c >= 'A' && c <= 'F' )
26
    return c - 'A' + 10;
27

28
  return c - '0';
29
}

du kannst das auch in Schleifen packen, wie es dir beliebt. Aufpassen 
musst du nur, dass du die beiden 'Hex-Zusammensetzteile' nicht in eine 
Anweisung packen kannst
1
     first = toHex( *found++ ) * 16 + toHex( *found++ );
weil hier ein paar Dinge nicht sauber wären. Kurz gesagt ist die 
Reihenfolge einiger Operationen so nicht definiert, wohingegen bei 2 
Anweisungen
1
      first = toHex( *found++ ) * 16;
2
      first += toHex( *found++ );
alles sauber und nach den Regeln der Kunst abläuft.

Allenfalls hätte man es noch so schreiben können
1
     ...
2

3
     first = toHex( found[1] ) * 16 + toHex( found[2] );
4
     found++
5

6
     ....
aber das schenkt sich nicht viel.
OP #3424423
Lesenswert?
• ▲
▼
Hallo Karl Heinz,
mal wieder vielen Dank für die ausführliche Betrachtung des ganzen. Hat 
mir super weitergeholfen.
Hab das Buch von Ritchie aus dem Hanser Verlag. Da sind die String 
Funktionen nicht großartig beschrieben. Deine Ausführungen kann man 
immer verstehen.
Grüße Christian
#3424506
Lesenswert?
• ▲
▼
Eines noch.
Ich denke strchr ist hier deswegen einfacher, weil du von strtok keinen 
Mehrwert hast.
Weder musst du nach mehreren Zeichen gleichzeitig suchen, noch hast du 
etwas davon, dass dir strtok den Originalstring in lauter Einzelteile 
unterteilt. Denn es gibt keine Standardfunktion die man auf die 
Teilstrings ansetzen könnte und die die Hex-Zahl dann da einfach 
rausholt (ala atoi nur für Hex-Zahlen).

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.