Hallo, ich bekomme über die Serielle Schnittstelle bestimmte Befehle rein. zB. a100\n a0\n .... Das \n wird bereits vorzeitig weggefiltert und gibt an, dass der String komplett empfangen wurde. Nun würde ich gerne noch das a von 100 splitten. a kann ich einfach mit uart_string[0] auslesen, wie mache ich das mit den anderen? int num = atoi(uart_string)?
int num = atoi(uart_string + 1); überspringt das a am Anfang. Anschließend steht in num der numerische Wert der Zahl.
Du guckst dir an, was das erste Zeichen ist, in deinem Fall ein 'a'. Dann guckst du, an welcher Stelle sich dein '\n' im String befindet. Somit weisst du wieviel Zeichen dazwischen liegen. Somit kannst du dann also berechnen:
1 | switch (anzahl_zeichen_dazwischen){ |
2 | case 1: Zahl = uart_string[1] + '0'; break; |
3 | case 2: Zahl = (uart_string[1] + '0') * 10 + (uart_string[2] + '0'); break; |
4 | case 3: Zahl = (uart_string[1] + '0') * 100 + (uart_string[2] + '0') * 10 + (uart_string[3] + '0'); break; |
5 | usw... |
6 | default: break; |
7 | }
|
So auf die Schnelle, geht bestimmt auch eleganter mit atoi und Konsorten. Ingo
Ingo Less schrieb: > Zahl = uart_string[1] + '0'; Sieh Dir das noch mal genauer an. > (uart_string[1] + '10') Und das hier noch genauer.
Rufus Τ. Firefly schrieb: > Sieh Dir das noch mal genauer an. Wollte ich gerade korrigieren, war aber schon zu spät. Kannst du das machen? Rufus Τ. Firefly schrieb: > Und das hier noch genauer. Das habe ich schnell genug korrigiert ;) Anschließend beide Kommentare danach löschen
\n würde ich sicherheitshalber durch 0x00 ersetzen. Dann ist der string richtig terminiert.
Ingo Less schrieb: > Rufus Τ. Firefly schrieb: >> Sieh Dir das noch mal genauer an. > Wollte ich gerade korrigieren, war aber schon zu spät. Kannst du das > machen? Da kein Mod meinen Beitrag korrigiert, nochmal in richtig:
1 | switch (anzahl_zeichen_dazwischen){ |
2 | case 1: Zahl = uart_string[1] - '0'; break; |
3 | case 2: Zahl = (uart_string[1] - '0') * 10 + (uart_string[2] - '0'); break; |
4 | case 3: Zahl = (uart_string[1] - '0') * 100 + (uart_string[2] - '0') * 10 + (uart_string[3] - '0'); break; |
5 | usw... |
6 | default: break; |
7 | }
|
Habs nicht ausprobiert, aber so sparst Du Dir die switch-cases - ob der compilierte Code kürzer ist - keine Ahnung... char *tmp = &uart_string[1]; int output = 0; while (*tmp != '\n') { output = 10 * output + (*tmp - '0'); tmp++; } Ansonsten atoi ...
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.