Was spricht dagegen eine eigene Methode zu implementieren die einfach alle Zeichen vergleicht? Auf die Art könntest du auch überprüfen welcher Wert größer ist.
Wäre ja nur eine Schleife.
Hallo,
bin noch nicht besonders sicher auf dem Gebiet der C Programmierung und auch neu in diesem Forum.
Sitze momentan an einer kleinen Automatisierung.
Ein Motor soll angesteuert werden, bis ein Messgerät einen Schwellenwert erreicht/überschritten hat.
Hierfür benutze ich das RN-Control 1.4 board mit dem ATmega32 (GCC compiler).
Das Messgerät ist über UART (8N1, nicht Interrupt gesteuert) verbunden und schickt den Wert als einen String: z.B. "-1.567E+01 N"
Mein Problem ist nun der Vergleich des Strings mit dem Schwellenwert.
Momentan benutze ich den strcomp() Befehl, das Problem ist nur, dass er natürlich den Motor abschaltet, sobald ein character des Strings einem charakter des Schwellenwert entspricht (Vorzeichen reicht da ja), daher hab ich erst mal den string mit strtok() von Vorzeichen und N getrennt.
Ich hatte auch daran gedacht den übrig gebliebenen string in ein double zu wandeln und dann die Werte als double zu vergleichen. Wäre das sinnvoll?Code:char fmax [] = "1.500E+01"; char data [12]; char *value; char delimiter [] = "+-N "; ... for (;;) { uart_puts(":72\r\n"); //Wert anfordern uart_gets(data, 12); //Wert empfangen value = strtok(data, delimiter); //von Vorzeichen, N trennen if(strcmp(value, fmax) != 1) //vergleichen { setportboff (0); //Motor aus uart_puts (":9,0\r\n"); //Messzyklus beenden sound (10,270); break; } else continue;*/ }
Meine Fragen:
Taugt das Programm was?
Irgendwelche alternativen um die Werte zu vergleichen?
Ich wäre über jede Hilfe dankbar,
Gruß Steffi
Vergessen:
Wenn ich das Programm laufen lasse, steigt er entweder sofort aus dem Programm aus oder garnicht (auch wenn der Schwellenwert eigentlich schon erreicht ist)
Was spricht dagegen eine eigene Methode zu implementieren die einfach alle Zeichen vergleicht? Auf die Art könntest du auch überprüfen welcher Wert größer ist.
Wäre ja nur eine Schleife.
Hi,
so wie du hier im Beispiel strtok anwendest wird dein Vergleich nie etwas Vernünftiges bringen. Lies hierfür z.B. mal unter folgendem Link http://www.c-howto.de/tutorial-strin...en-strtok.html
Wenn du sowieso nur wissen willst, ob dein String 1.500E enthält, dann prüfe doch mit strncmp die ersten 5 bzw sechs Zeichen.
Allerdings wirst du dann immer noch nicht wissen, ob der Wert schon größer ist. Dafür bietet sich z.B. strtok an. Nur solltest du dann das Plus und Minus nicht als Separator verwenden, da es dir sonst den String nach dem E abschneidet.
Du kannst am Stringanfang auf - testen und beim Rest dann das Leerzeichen vor dem N als Separator nutzen. Dann wandelst du in eine Zahl und vergleichst diese mit deiner Vorgabe.
sast
雅思特史特芬
开发及研究
HI,
ich hab heute einiges ausprobiert. Mit umwandeln, einzelne Zeichen abfragen, zerschneiden mit strtok usw.
Leider hab ich es maximal geschafft, dass er die ersten Ziffern erkennt und dann abbricht ohne den Exponenten zu beurteilen. anstatt bei 150 hat er dann schon bei 1,5 abgebrochen.
Hier mal ein Beispiel eines Fehlversuchs:
Hab bestimmt wieder die Stringfunktionen falsch angewandt. Hab zwar u.a. auch auf http://www.c-howto.de/tutorial-stri....en-strtok.html nachgesehen, konnte für mich aber leider keine Lehren draus ziehen.Code:/*********************************************/ char fmaxstr []= "+1,500E+02"; //string 8.000 double fmax = strtod (fmaxstr, NULL); // turn string into floating point number char data [14]; char valueshort [14]; char value [14]; double valuecomp; char delimiter []= " "; for (;;) { uart_flush(); waitms (5); uart_puts(":72\r\n"); waitms (5); uart_gets(data, 14); // empfängt z.B. ",-1.500E+02 N" data[3] = ','; // aus . mach , data[1] = '+'; // Vorzeichen immer + (weil egal) strcpy (value, strtok(data, delimiter)); // zerschneiden strcpy (valueshort,value + 1); // ein KOMMA, das vor dem eigentlichen Wert gesendet wird, abtrennen valuecomp = strtod (valueshort, NULL); // Rest "+1,500E+02" in double umwandeln if (valuecomp >= fmax) { setportboff (0); uart_puts (":9,0\r\n"); sound (10,270); break; } else continue; /***********************************************/
Bitte sagt mir was ich falsch gemacht hab. Wär super, wenn mir jemand nen Vorschlag zu dieser Problematik machen könnte.
Danke
zu strtod:
A valid floating point number for strtod is formed by a succession of:
* An optional plus or minus sign
* A sequence of digits, optionally containing a decimal-point character
* An optional exponent part, which itself consists on an 'e' or 'E' character followed by an optional sign and a sequence of digits.
Warum machst du aus dem Dezimalpunkt ein Komma? strtod verlangt einen Punkt.
Woher weißt du, dass 1,5 als double Wert herauskommt? Wie debugst du die Ausführung?
Wenn dein String korrekt ankommt, kannst du dir das strtok eigentlich sogar sparen. Du müsstest strtod auf data+1 anwenden und der finden dann selbständig raus, dass das nächste Zeichen nach zB E02 nicht zum Zahlenwert gehört. Soweit habe ich das jedenfalls nach dem Überfliegen der strtod Funktion verstanden. Du verwendest es ja wie atof wenn du vorher noch den Token rausfilterst.
Wie gesagt, wenn der String IMMER korrekt ankommt bis zu N.
sast
雅思特史特芬
开发及研究
Lesezeichen