- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: gesamten String [12] vergleichen

  1. #1

    gesamten String [12] vergleichen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.
    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;*/
    							}
    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)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    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.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    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

    雅思特史特芬
    开发及研究

  4. #4
    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:
    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;
    
    /***********************************************/
    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.
    Bitte sagt mir was ich falsch gemacht hab. Wär super, wenn mir jemand nen Vorschlag zu dieser Problematik machen könnte.

    Danke

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    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

    雅思特史特芬
    开发及研究

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress