Forum: Mikrocontroller und Digitale Elektronik Zahl aus String extrahieren (AVRGCC)


von Bernd (Gast)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

int num = atoi(uart_string + 1);

überspringt das a am Anfang. Anschließend steht in num der numerische 
Wert der Zahl.

von Ingo L. (corrtexx)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ingo Less schrieb:
> Zahl = uart_string[1] + '0';

Sieh Dir das noch mal genauer an.

> (uart_string[1] + '10')

Und das hier noch genauer.

von Ingo L. (corrtexx)


Lesenswert?

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

von reimay (Gast)


Lesenswert?

\n würde ich sicherheitshalber durch 0x00 ersetzen.
Dann ist der string richtig terminiert.

von Ingo L. (corrtexx)


Lesenswert?

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
}

von Ronny S. (duselbaer)


Lesenswert?

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

von Ingo L. (corrtexx)


Lesenswert?

Auch hübsch!

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.