atoi macht char 2-fach?

Gast #2752636
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
Gast #2752655
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]);
Gast #2752677
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?
(Firma: guloshop.de) #2753080
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren