PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gesamten String [12] vergleichen



sr234
27.09.2010, 13:30
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.


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;*/
}


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?

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)

TobiKa
27.09.2010, 15:17
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.

sast
27.09.2010, 15:28
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-strings-zeichenketten-stringfunktionen-zerteilen-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

sr234
28.09.2010, 16:55
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:


/*********************************************/

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;

/***********************************************/


Hab bestimmt wieder die Stringfunktionen falsch angewandt. Hab zwar u.a. auch auf http://www.c-howto.de/tutorial-stri.....nen-zerteilen-strtok.html nachgesehen, konnte für mich aber leider keine Lehren draus ziehen.
Bitte sagt mir was ich falsch gemacht hab. Wär super, wenn mir jemand nen Vorschlag zu dieser Problematik machen könnte.

Danke

sast
28.09.2010, 18:23
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