Wort einlesen und vergleichen

vor 43 weeks 2 days von RSHeinz

Hallo!
Ich will ein Wort einlesen und es mit einem abgespeicherten Wort verlgeichen. Hab im Netz ein schönes Beispiel gefunden nur wenn ich es ausprobiere funktioniert es nur einmal und ich weiß einfach nicht warum, kann mir jemand helfen?

#define MAXSTRING 5
char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
byte index = 0;

void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}

void loop()
{
if (Serial.available() > 0 && index < MAXSTRING) {
inString

= Serial.read();
inString[index+1] = '\0';
index += 1;
}

if ( index == MAXSTRING ) {
if ( !strcmp(inString, "start") ) {
Serial.write("Start empfangen\n");
digitalWrite(13, HIGH); // set the LED on
index = 0;
} else if ( !strcmp(inString, "stopp") ) {
Serial.write("Stopp empfangen\n");
digitalWrite(13, LOW); // set the LED off
index = 0;
}
}
}

Ähnliche Posts

41 Antworten auf “Wort einlesen und vergleichen”


Seite 1 von 2nächste>>

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
  1. chrimbo sagt:

    Kann es sein dass du noch ein CR und oder LF sendest? (Drückst du ENTER?)
    ersetze mal das

    if ( index == MAXSTRING ) {
    if ( !strcmp(inString, "start") ) {
    Serial.write("Start empfangen\n");
    digitalWrite(13, HIGH); // set the LED on
    index = 0;
    } else if ( !strcmp(inString, "stopp") ) {
    Serial.write("Stopp empfangen\n");
    digitalWrite(13, LOW); // set the LED off
    index = 0;
    }
    }

    mit dem
    if ( index == MAXSTRING ) 
    {
      if ( !strcmp(inString, "start") ) 
      {
        Serial.write("Start empfangen\n");
        digitalWrite(13, HIGH); // set the LED on
      } 
      else if ( !strcmp(inString, "stopp") ) 
      {
        Serial.write("Stopp empfangen\n");
        digitalWrite(13, LOW); // set the LED off
      }
      while(Serial.available())
        Serial.read();
      index = 0;
    }

    Login or register to post comments

  1. RSHeinz sagt:

    Ja hattest Recht, hatte nicht aufgepasst. Vielen Dank!

    Wie kann ich den Sketch am Laufen halten auch wenn andere Zeichen gesendet werden?

    Ich hab ein Modul angeschlossen das mir immer wieder verschiedene Statusmeldungen sendet und ich will nur auf bestimmte Wörter reagieren. Leider funktoniert der Sketch nicht mehr sobald ein anderes Zeichen gesendet wurde.

    Login or register to post comments

  1. chrimbo sagt:

    Du musst irgendwie den Buffer wieder leeren. Am besten ist es, wenn ein CR kommt den buffer danach zu leeren. So kannst du wenn du dich vertippst einfach Enter drücken und von vorne beginnen.

    Login or register to post comments

  1. chrimbo sagt:

    Du könntest zum Beispiel sowas schreiben:

    char finishflag = 0;
    ...
    while(Serial.available())
    {
    	char c = Serial.read();
    	if(c=='\r')
    	{
    		finishflag = 1;
                    inString[index++] = 0;
    	}
    	else if(index<MAXSTRING)
    	{
    		inString[index++] = c;
    	}
    	else
    	{
    		// Fehler?!
    	}
    }
    if(finishflag)
      finishflag = 0;
      if( !strmcpm(inString, "start")
      {
      ...
      }
    }

    Login or register to post comments

  1. RSHeinz sagt:

    Danke für deine Mühe!
    Irgendwie funktioniert es aber nicht bei mir. Was hab ich falsch gemacht?

    #define MAXSTRING 5
    char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
    byte index = 0;
    char finishflag = 0;
     
    void setup()
    {
      Serial.begin(9600);
      pinMode(13, OUTPUT);
    }
     
    void loop()
    {
     /* if (Serial.available() > 0 && index < MAXSTRING) {
        inString<ol>
    </ol>
     = Serial.read();
     
        inString[index+1] = '\0';
        index += 1;
      }
      */
      while(Serial.available())
    {
    	char c = Serial.read();
    	if(c=='\r')
    	{
    		finishflag = 1;
                    inString[index++] = 0;
    	}
    	else if(index<MAXSTRING)
    	{
    		inString[index++] = c;
    	}
    	else
      {
      }
     
    }
     
      if ( index == MAXSTRING ) 
      {
      if(finishflag)
      finishflag = 0;
     
        if ( !strcmp(inString, "start") ) 
        {
        Serial.write("Start empfangen\n");
        digitalWrite(13, HIGH); // set the LED on
        } 
        else if ( !strcmp(inString, "stopp") ) 
        {
        Serial.write("Stopp empfangen\n");
        digitalWrite(13, LOW); // set the LED off
        }
     
      while(Serial.available())
        Serial.read();
      index = 0;
     
    }
    }

    Login or register to post comments

  1. chrimbo sagt:

    Hi,

    vllt ist es auch '\n' also hier

    if(c=='\r')

    zu
    if( (c=='\r')||(c=='\n') )

    evtl funzt es so:
    EDIT: Es gibt Formatierungsprobleme, ich lad es hoch.
    Link

    Login or register to post comments

  1. RSHeinz sagt:

    Hey!
    Hab es verstanden aber leider funktioniert das noch weniger, langsam fang ich an zu verzweifeln.

    Login or register to post comments

  1. chrimbo sagt:

    Hi,

    wie es funktioniert noch weniger? Dann sind wir ja auf dem richtigen Weg :-)

    zeig doch nochmal genau, was du bisher hast.

    Login or register to post comments

  1. RSHeinz sagt:

    Hab es wieder neu übertragen und was von Anfang an ging funktioniert auch wieder, aber wenn wie gesagt was anderes empfangen wird so dass kein Vergleich stimmt, funktioniert nix mehr.
    Danke das du am Ball bleibst!

    #define MAXSTRING 5
    char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
    byte index = 0;
    char finishflag = 0;
     
    void setup()
    {
      Serial.begin(9600);
      pinMode(13, OUTPUT);
    }
     
    void loop()
    {
     /* if (Serial.available() > 0 && index < MAXSTRING) {
        inString<ol>
    </ol>
     = Serial.read();
     
        inString[index+1] = '\0';
        index += 1;
      }
      */
      while(Serial.available())
    {
    	char c = Serial.read();
    	if( (c=='\r')||(c=='\n') )
    	{
    		finishflag = 1;
                    inString[index++] = 0;
    	}
    	else if(index<MAXSTRING)
    	{
    		inString[index++] = c;
    	}
    	else
      {
      }
     
    }
     
      if ( index == MAXSTRING ) 
      {
      if(finishflag)
      finishflag = 0;
     
        if ( !strcmp(inString, "start") ) 
        {
        Serial.write("Start empfangen\n");
        digitalWrite(13, HIGH); // set the LED on
        } 
        else if ( !strcmp(inString, "stopp") ) 
        {
        Serial.write("Stopp empfangen\n");
        digitalWrite(13, LOW); // set the LED off
        }
     
      while(Serial.available())
        Serial.read();
      index = 0;
     
    }
    }

    Login or register to post comments

  1. chrimbo sagt:

    Ok, Hi.

    Das müsste nun funzen. Hab sogar meinen Arduino rausgekramt und selbst getestet.
    Link

    Login or register to post comments

  1. RSHeinz sagt:

    Ja es funktioniert! Super!
    Nur mit dem angeschlossenen Modul hat es noch nicht funtioniert. Kann es sein das die Enter- Taste nach der Eingabe erforderlich ist, damit der Sketch es aufnimmt?

    Gruß

    Login or register to post comments

  1. chrimbo sagt:

    Hi,
    gut :-)
    Aus der Arduion Umgebung ist die Enter-Taste erforderlich sonst sendet der ja nicht. Da kann man aber auch einstellen, was er mit senden soll (none, LF, CR, CR+LF).
    Ansonsten wird beendet, sobald 5 Zeichen empfangen wurden. Es müssen aber auch fünf sein und es muss dann entweder start oder stopp sein. Alles andere führt zu fehlern.

    Gruß

    Login or register to post comments

  1. RSHeinz sagt:

    Ja genau, das hab ich soweit vestanden. :-)
    Wenn ich mit der Umgebung oder einem anderen Programm sende funktioniert es super, nur nicht mit dem Shield. Ich hab das 3G/GPS Shields von Libelium und die Beispielsketche funktionieren soweit auch.

    Your text to link...

    Das Shield wird über die serielle Schnittstelle gesteuert und ich hab schon GPS Daten abgerufen und auch SMS versendet.
    Wenn ich das Shield anrufe schickt es über die Schnittstelle das Wort RING und darauf wollte ich dann reagieren und einen Ausgang schalten. Aber der Arduino reagiert einfach nicht darauf. Ich weiß nur das das Shield LF, CR und CR+LF mitsendet

    Login or register to post comments

  1. chrimbo sagt:

    Hi,

    und wo steht das, dass es CR+LF sendet?

    Login or register to post comments

  1. RSHeinz sagt:

    Aus einem anderen Forum, finde den Beitrag gerade nicht mehr. In dem Tutorial steht davon nichts drin. Die Beispielsketche funtionieren ja auch und sind eigentlich sehr simpel

    Login or register to post comments

  1. chrimbo sagt:

    ...
    Und du hast das validiert? Also dass das so kommt?

    Login or register to post comments

  1. RSHeinz sagt:

    Sicher nicht, davon hab ich keine Ahnung. :-((

    Login or register to post comments

  1. chrimbo sagt:

    Hallo Heinz,

    dann würde ich nicht davon ausgehen, dass das Ding ein "RING" sendet. Normalerweise spricht man so ein GSM Modul über AT-Kommandos an. Du solltest bevor du dich an sowas wagst erstmal mit Grundlagen beschäftigen. Ist nicht böse gemeint, aber sowas ist nicht so einfach. Wenn du irgendwelche fertigen Bibliotheken verwendest vielleicht schon, aber zu Fuß ist es halt um einiges komplizierter.
    Häng doch das Modul mal an den Verbinder X3 vom Arduino (hast du einen Uno? Da weiß ich nicht wie der heiß oder ob es den gibt) und steck den Atmega aus. Dann kannst du über hyperterminal oder so eine Verbindung aufbauen und dann anrufen, da siehst du dann was das Ding sendet. Ich kann dir leider auch nicht weiter helfen, da ich dieses Modul nicht habe und ich es mir auch so mal eben nur zum helfen nicht kaufen kann.

    gruß
    Christopher

    Login or register to post comments

  1. RSHeinz sagt:

    Hallo!
    Danke für deinen Support! Ja genau in die AT Komandos hab ich mich schon etwas eingelesen und kann auch das Modul damit steuern. Hab auch den Atmega mal ausgesteckt und das Arduino Bord als Gateway benutzt. Bekomme dann sobald ich anrufe ein RING zur Arduino IDE gesendet und wenn ich auflege auch noch die Info welche Nummer mich angerufen hat. Das ist ganz normaler Text ohne jegliche Zusatzzeichen, eigentlich müsste das doch dann funktionieren. Ich kann ja mal ein Mittschnitt zeigen was ich so vom Modul geschickt bekomme.

    Gruß

    Login or register to post comments

  1. RSHeinz sagt:

    3 mal klingeln lassen und dann abgebrochen.

    Login or register to post comments

  1. chrimbo sagt:

    Hi,

    Ok, woher kommen die Leerzeilen?
    Kannst du das nochmal mit was anderem mitschneiden? zb. mit HTerm?
    (http://www.der-hammer.info/terminal/) und dann die Hex Ansicht aktivieren. Wer weiß was da noch zwischendrin gesendet wird.

    Login or register to post comments

  1. RSHeinz sagt:

    Hey stimmt, hab die Leerzeilen garnicht beachtet. Ich hab noch Realterm, zeig ich morgen früh. Ich weiß was du meinst ;-))

    Login or register to post comments

  1. RSHeinz sagt:

    "CRLFCRLF" Die Kombination versteh ich nicht ganz

    Login or register to post comments

  1. RSHeinz sagt:

    Login or register to post comments

  1. chrimbo sagt:

    Hi, du hast aber schon
    Serial.begin(9600);
    ersetzt zu
    Serial.begin(115200);
    und in weiter unten
    if( !strcmp(inString, "RING"))
    ???
    CRLFCRLF erzeugt die Leerzeile:)

    Login or register to post comments

  1. RSHeinz sagt:

    Ja natürlich! Hab ich beides angepasst aber irgendwas hindert noch.
    Nur warum schickt der Ding 2 Leerzeilen, eine hätte auch gereicht!? :-(
    Kann doch eigentlich nur an den Leerzeilen liegen, oder?

    Login or register to post comments

  1. chrimbo sagt:

    nö, wenn ich das hier probiere klappt es auch mit zwei Leerzeichen. Leider hab ich meinen Arduino gestern zerschossen. Kann nicht mehr auf den Bootloader zugreifen. Shit happens.

    Aber du kannst ja auch mal versuchen an den Arduino über hterm zu schicken: "START"+CRLF+CRLF

    Login or register to post comments

  1. RSHeinz sagt:

    Na läuft er wieder oder brauchst du einen Neuen?

    Hm also irgendwie bekomm ich mit Hterm nix versendet, bzw kommt nix zurück.

    Login or register to post comments

  1. chrimbo sagt:

    Nein ich bräuchte einen neuen.
    Du musst bei HTERM enter drücken, das weißt du oder? Und er sendet nicht von alleine eine CRLF mit, dass musst du ihm auch sagen mit send on enter.

    lg
    Chrimbo

    Login or register to post comments

  1. RSHeinz sagt:

    Ja und das funktioniert auch mit START. Aber mit einer Leerstelle hinter dem Wort geht schon nix mehr

    Login or register to post comments

Seite 1 von 2nächste>>