Hallo,
ich habe eine Funktion geschrieben, der man die Anzahl der zu
erwartenden Zeichen/Ziffern, die ueber UART reinkommen, mit gibt und die
so lang darauf wartet, bis genug Zeichen eingetroffen sind und danach
dann eine Zahl daraus machen soll.
Das Ganze sieht so aus:
1
intexpectNumber(intdigits){
2
charinput;
3
intr=0;
4
inti;
5
6
for(i=1;i<=digits;i++)
7
{
8
input=UARTReceive();
9
while(!characterIsNumber(input)){
10
input=UARTReceive();
11
}
12
13
intn=atoi(&input);
14
15
r+=(10^(digits-i))*n;
16
17
charbuf[50];
18
sprintf(buf,"\n\n Char is: %c, n is: %d, r is now: %d\n",input,n,r);
19
UARTPuts(buf);
20
}
21
returnr;
22
}
Das rufe ich nun zum Beispiel mit expectNumber(2) auf, um 2 Ziffern zu
erwarten.
Nun wuerde ich erwarten, dass, wenn ich z.B. als erstes Zeichen 1
uebermittle, r im ersten Schleifendurchlauf dann den Wert (10^1)*1=10
annimmt. Tatsaechlich kommt aber 11 raus. Was ich mir nicht wirklich
erklaeren kann.
Uebersehe ich was?
Viele Gruesse,
Martin
gagast schrieb:>>10^(digits-i)> ^ ist XOR, ist das gewollt?
Oh. Ohhhh. Danke. Das soll natuerlich kein XOR sein, sondern ein "hoch".
Und ich zerbrech mir Stunden den Kopf darueber, warum das jetzt nicht
geht.
Vielen Dank fuer die Erleuchtung!
Martin S. schrieb:> int n = atoi(&input);
input ist ein char. atoi erwartet einen String, also ein
nullterminiertes Array aus char. Wenn du die Adresse von input
übergibst, nimmt atoi das und dann noch alles, was danach zufällig so im
Speicher steht, bis es dann eine 0 findet und wertet alles zusammen als
den übergebenen String.
Rolf Magnus schrieb:> input ist ein char. atoi erwartet einen String, also ein> nullterminiertes Array aus char. Wenn du die Adresse von input> übergibst, nimmt atoi das und dann noch alles, was danach zufällig so im> Speicher steht, bis es dann eine 0 findet und wertet alles zusammen als> den übergebenen String.
Danke fuer die Erlaeuterung. Ich habe mir da auch schon Gedanken
gemacht, aber so funktioniert es. Was waere denn die korrekte Loesung?
Martin S. schrieb:> Danke fuer die Erlaeuterung. Ich habe mir da auch schon Gedanken> gemacht, aber so funktioniert es.
Das ist kein Argument. Es 'funktioniert' höchstens zufällig
> Was waere denn die korrekte Loesung?
n = input - '0';
Vielen Dank noch fuer die Anregungen. Nein, war mir nicht bewusst, dass
es die Funktion schon gibt. Habe eigentlich erst heute damit angefangen
und bin noch nicht wirklich heimisch. ;-)
Martin S. schrieb:> Vielen Dank noch fuer die Anregungen. Nein, war mir nicht bewusst, dass> es die Funktion schon gibt. Habe eigentlich erst heute damit angefangen> und bin noch nicht wirklich heimisch. ;-)
Ein C-Buch durcharbeiten kann wahre Wunder bei fehlendem Wissen wirken.
zb
http://openbook.galileocomputing.de/c_von_a_bis_z/
Martin S. schrieb:> die ueber UART reinkommen, mit gibt und die> so lang darauf wartet, bis genug Zeichen eingetroffen sind
Damit läuft man Gefahr, daß Dein Programm hängen bleibt und nichts
anderes mehr machen kann.
Die übliche Methode ist daher, daß man von der UART in einen Puffer
einliest. Und erst, wenn z.B. ein Endezeichen (z.B. CR,LF) emfangen
wurde, übergibt man den Puffer zur Auswertung.
So wird nicht unnütz CPU-Zeit mit Warten vergeudet.
Peter
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.