Forum: Mikrocontroller und Digitale Elektronik Kommazahl über ser. Schnittstelle in EEprom


von Michael (Gast)


Lesenswert?

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;

  }

von Urmel (Gast)


Lesenswert?

Gib uns mal die Warnungen die der Compiler ausspuckt. Mir ahnt übles.

von Stephan (Gast)


Lesenswert?

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 ?

von Michael (Gast)


Lesenswert?

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 ?

von Michael (Gast)


Lesenswert?

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 ?

von N. A. (hannilein)


Lesenswert?


von Stephan (Gast)


Lesenswert?

>"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!!!!

von Michael (Gast)


Lesenswert?

Wie könnte man dann die Kommzahleingabe über die serielle Schnittstelle 
bewerkstelligen, also wie macht macht mann sowas richtig ?

von Stephan (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von Stephan (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von Stephan (Gast)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

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!

von Michael (Gast)


Lesenswert?

Es funktioniert.

Vielen Dank, Stephan !

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.