Forum: Mikrocontroller und Digitale Elektronik atoi macht char 2-fach?


von Dirk (Gast)


Lesenswert?

Hallo,
ich sende über einen Interrupt einen String zu meinem Programm, dadurch 
soll eine Anzahl an Kanälen definiert werden, da diese Anzahl der Kanäle 
über 9 ist, sende ich 2 Stellen, die ich dann aufaddiere (siehe unten:
Interrupt-Routine:
uart_string ist: "X53Z", bei Z wird die Routine aufgerufen...
1
   channels = 0;
2
   int chan1= atoi(&uart_string[1]);
3
   int chan2= atoi(&uart_string[2]);
4
   channels= chan1*10;//umrechnen der 2 Strings auf eine 2-stellig
5
   channels= channels + chan2;
--> ich habe nun das Problem, dass für chan2 immer der String 2 mal 
kommt, es steht dann also 33 drin

somit wird als Wert für Channel 533 berechnet, es sollte aber 53 sein

Gruß
Dirk

von casud (Gast)


Lesenswert?

Du erhälst für chan1 den Wert 53 und nicht für chan2 = 33 !
Warum nicht einfach chan1 = uart_string[1] - '0' bzw. chan2 = 
uart_string[2] - '0' ?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Na dann schau doch mal nach was atoi() wirklich macht ...

atoi() setzt einen String in eine int um. Keine einzelnen Bytes.

von casud (Gast)


Lesenswert?

Oder gleich channels = atoi(uart_string); ?

von Klaus W. (mfgkw)


Lesenswert?

oder noch einfacher: channels=atoi(&uart_string[1]);

von Klaus W. (mfgkw)


Lesenswert?

casud schrieb:
> Oder gleich channels = atoi(uart_string); ?

er muß zumindest das erste Zeichen übergehen.

von casud (Gast)


Lesenswert?

Stimmt. Danke :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
>> Oder gleich channels = atoi(uart_string); ?
>
> er muß zumindest das erste Zeichen übergehen.


atoi(uart_string + 1);

von Uwe (Gast)


Lesenswert?

Ein string MUß aber mit einer 0 terminiert werden.
Mach aus dem 'Z' eine 0 also eine char a=0; nicht char a='0'.
Dann funktioniert die funktion atoi auch.

  uart_string[3]=0;
  channels = atoi(&uart_string[1]);

von Uwe (Gast)


Lesenswert?

Achso stimmt atoi macht ja nur solage bis keine gültigen Zeichen mehr 
kommen also hört auch bei 'Z' auf.

von Dirk (Gast)


Lesenswert?

Hallo,
nun hab ich aber doch ein Verständnisproblem, ich habe doch den "char 
uart_String[]" mit insgesamt 4 Stellen, uart_string[0] bis ..[3] Inhalt 
ist X50Z, jetzt dachte ich (ich komm von Java..) uart_string[0] = X 
uart_string[1] = 5 usw. Dem ist also nicht so?

von Uwe (Gast)


Lesenswert?

Nö da steht der ASCII Code von 5 drin der ist 0x30+5 als 0x35.
0 = 0x30
1 = 0x31
...
5 = 0x35

9 = 0x39

http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

von Uwe (Gast)


Lesenswert?

Es macht in C einen Unterschied ob man schreibt
char a=5 oder char a='5'
es macht aber keinen unterschied ob man schreibt
char a=0x35

von Uwe (Gast)


Lesenswert?

oder char a='5'

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Klaus Wachtler schrieb:
> oder noch einfacher: channels=atoi(&uart_string[1]);

Warum nicht so?
  chan1= uart_string[1]-'0';
  chan2= uart_string[2]-'0';

Wenn es immer genau zwei Stellen sind:
  channels= (uart_string[1]-'0')*10 + uart_string[2]-'0';

Läuft beides viiiel schneller.

Falls der Mikrocontroller nicht multiplizieren kann (z.B. ATtiny), gibts 
eine noch bessere Lösung.

Kann aber gut sein, dass ich die Aufgabenstellung nicht ganz verstanden 
habe...

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.