Hallo zusammen,
ich würde gerne über die serielle Schnittstelle Kommazahlkonstanten in
den EEprom meines Atmega schreiben. Mit int-Variablen funktioniert das
alles sehr gut, nur wenn ich es auf float-Variable ändere, wird der Wert
gleich 0, sobald ich in der switch-Abfrage etwas reinschreiben will.
Als Befehl im Terminalprogramm gebe ich z.Bsp. "0 17.59" ein.
Was mache ich da falsch ?
float eeWertA EEMEM = 17.59;
float eeWertB EEMEM = -0.293;
float eeWertC EEMEM = 648.8;
float eeWertD EEMEM = -1.94;
float Wert;
uart_gets(Buffer, 20); // Auf eine Zeile vom Benutzer warten
switch (Buffer[0] - '0')
{
case (0): //Wert A
Wert = atof( &Buffer[10] );
eeprom_write_float (&eeWertA, Wert);
break;
case (1): //Wert B
Wert = atof( &Buffer[10] );
eeprom_write_float (&eeWertB, Wert);
break;
}
Gib uns mal die Warnungen die der Compiler ausspuckt. Mir ahnt übles.
Michael gib mal das richtige Programm und nicht SO ein murks. >"0 17.59" Wenn das deine Eingabe ist wie soll >Wert = atof( &Buffer[10] ); Da was gutes raus kommen????? prüfst du 'Wert' auf 0.0 bzw NaN ?
Urmel schrieb: > Gib uns mal die Warnungen die der Compiler ausspuckt. Mir ahnt übles. Ich habe noch so einige Warnungen im Programm, aber keine die sich auf diese Zeilen bezieht. Was könnte es denn übles sein ?
Stephan schrieb: >>"0 17.59" > Wenn das deine Eingabe ist wie soll > >>Wert = atof( &Buffer[10] ); > Da was gutes raus kommen????? Bei int-Variablen und "atoi" anstatt "atof" funktioniert das mit der Eingabe "0 Variable" Warum kann ich das nicht für float übernehmen ?
>"0 17.59"
ABER sicher nicht bei der Eingabe!!!!
DAS sind doch nur 7 Zeichen + '\0' max.
WIE soll das den mit "&Buffer[10]" gehen????
Da sind doch keine DATEN!!!!
Wie könnte man dann die Kommzahleingabe über die serielle Schnittstelle bewerkstelligen, also wie macht macht mann sowas richtig ?
>"0 17.59" Wenn das deine Eingabe ist.... Muss die Bearbeitung auch an der richtigen Stelle beginnen... >Wert = atof( &Buffer[2] ); dann schau dir mal die Funktion atof() genau an, was gib sie im Fehlerfall zurück? Wenn bei dir 0.0 erlaubt ist hast du noch einiges vor dir. Musst du denn unbedingt float verwenden?
Stephan schrieb: > dann schau dir mal die Funktion atof() genau an, was gib sie im > Fehlerfall zurück? > Wenn bei dir 0.0 erlaubt ist hast du noch einiges vor dir. > > Musst du denn unbedingt float verwenden? atof() wird im Fehlerfall wohl 0 ausgeben. Die Eingabe 0.0 wird bei gar nicht vorkommen, da ich die Variablenwerte manuell eingebe. Es muss nicht unbedingt float sein, aber ich würde es gerne als Kommazahl eingeben, und es ungern über eine Int-Umrechnung machen. Aber wenn's so einfach nicht geht, dann bleibt mir wohl nichts anderes übrig.
Wenn du keine 0 hast geht es doch. nur der Start der Decodierung war im Beispiel zur Eingabe total falsch!!!! Deshalb die Frage nach dem richtigen Code.
Stephan schrieb: > nur der Start der Decodierung war im Beispiel zur Eingabe total Mit dem Start der Decodierung meinst du switch (Buffer[2] - '0') anstatt switch (Buffer[0] - '0') oder ? Leider funtkioniert es noch immer nicht. Der Wert der Variablen ändert sich durch die Eingabe leider gar nicht mehr.
>"0 17.59" Wenn das deine Eingabe ist.. >switch (Buffer[0] - '0') Wäre das ok, wenn die 0 ein SchreibCMD für Wert A ist. >Wert = atof( &Buffer[2] ); und dort wäre dein float.
schau dir mal dies an: http://www.c-howto.de/tutorial-strings-zeichenketten-stringfunktionen-zerteilen-strtok.html Dann kannst du die starren Offsets vielleicht raus nehmen und die Kommandos und Werte besser auswerten. Wenn du eine solche Kommandozeile einbaust, wäre es etwas besser für den User, wenn du es in etwa so machst: (lesbarer) set Var0 Wert (schreiben) get Var0 (lesen) clr Var0 (löschen) def Var0 (default Wert) nur als Beispiel!
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.