Forum: Mikrocontroller und Digitale Elektronik String zerlegen und Werte umwandeln


von Chris T. (chris0086)


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

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

>  Ich habe über Strtok gelesen aber da wird immer mit printf
> gearbeitet und ich weis nicht wie ich die Werte in eine Variable bekomme.

Dann solltest du erst mal in deinem C-Buch das Kapitel über 
Stringverarbeitung studieren. Denn darum dreht sich im Grunde alles.

von Chris T. (chris0086)


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

von Karl H. (kbuchegg)


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).

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.