Webinterface Werte einlesen und Seriell Werte einlesen

Hallo,

Frage1:

ich möchte gerne mit meinem Uno + Eth.Shield per Webinterface z.B. einen Raumnamen einlesen und dann in einen Variable übergeben ?

Hat jemand ne Idee wie ich das schickter hinbekomme in im angehängen Code(ausschnitt) ?

Hab schon div. Codebeispiele erfolglos getestet .....

void loop()
{

  EthernetClient client = server.available();
  if (client) {

    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
       
        if (readString.length() < 200) {

readString = readString + c;

if(readString.indexOf("?testname2=") > -1)
{
Serial.println("test");
  if(readString.indexOf("?testname2=") > +1)
  {
  Serial.println("test");
  }

}

client.print("<html><head>");
client.print("<title>Webserver</title>");
client.println("</head>");
client.print("<form method=get><input name='testname2' value='Wohnzimmer' type='text' size='30' maxlength='30'><input type=submit name=6 value='einschalten'></form>");

 break;
        }
        if (c == '\n') {
         
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
         
          currentLineIsBlank = false;
        } 
      }
    }
    
    delay(10);

    Serial.print(readString);
    client.stop();
    readString="";
  }
}

Bin etwas am verzweifeln!? 8)

Frage2:

Ich möchte gerne Seriel die Raumnamen und Solltemperaturwerte festlegen... hab schon mit Serial Read umgetestet bekomms aber nicht zum laufen. Meine Vorstellung war bei der Serieleneingabe:

Eingabe1: raum1;wohnzimmer
Eingabe2: raum1temp;20.00

bin bis jetzt immer an Char, String Problemen hängen geblieben.... hat da jemand evtl. ein Beispiel Prog. oder ne Idee ?

Vielen Dank im vorraus!

Gruß
Jens

Falls Du Dein Projekt mal produktiv einsetzen willst (24/7), solltest Du die String-Klasse nicht benützen. Die Art und Weise, wie sie implementiert wurde, ist Gift für einen längeren Betrieb auf einem Mikrokontroller. Versuche Deinen Aufbau mit char-Arrays zu machen.

Zur Frage1:

Lies die ganze GET-Zeile ein, bevor Du mit dem Suchen von Teilstrings beginnst. Alternativ könntest Du direkt parsen, dann müsstest Du aber eine kleine State Machine implementieren.

Am Einfachsten wäre also das Lesen des "GET "-Teils. Von da an schreibe den Pfad in einen Pufferbereich bis Du wieder auf ein Leerzeichen triffst. Dort ist der Pfad zu Ende und Du kannst wahrscheinlich aufhören, den Header weiter zu parsen. Du hast dann den ganzen GET-Pfad im Puffer und kannst Dich mittels strncmp() bzw. strstr() auf die Suche nach Deinen gewünschten Begriffen begeben.

Zu Frage 2:

Auch hier würde ich bis zum Trennzeichen (bei Dir wahrscheinlich eine Zeilenschaltung) in einen Puffer lesen (immer auf die Grössenbeschränkung achten) und dann mittels obigen Funktionen oder auch strtok() die Anweisungen auseinander nehmen. Ich würde mir allerdings gut überlegen, ob nicht ein kompakteres Protokoll erfolgversprechender ist.

Hallo Pylon,

danke für deine Antwort.

Leider kann ich mit den Tipps als "Anfänger" nich so viel anfangen. Gibst den evtl. ein Beispiel Sketch?

Kann mir jemand helfen den Code:

void loop(void) {

  int i=0;
  char commandbuffer[100];

  if(Serial.available()){
     delay(100);
     while( Serial.available() && i< 99) {
        commandbuffer[i++] = Serial.read();
     }
     commandbuffer[i++]='\0';
  }

  if(i>0)
  {
     Serial.println((char*)commandbuffer);
    
     
  }
  
   
  if((char*)commandbuffer == "test")
  {
   Serial.println("Testausgabe");
  }

zum laufen zu bringen wenn ich Serial: test eingebe ?

Gruß
Jens

Lan-Police:
Kann mir jemand helfen den Code:
...
zum laufen zu bringen wenn ich Serial: test eingebe ?

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
}

void loop(void) 
{
  char commandbuffer[100];
  char c;
  int i=0;
  // Puffer mit Nullbytes fuellen und dadurch loeschen
  memset(commandbuffer,0,sizeof(commandbuffer));
  if (Serial.available())
  {
    delay(100);
    while (Serial.available())
    {
      c=Serial.read();
      if (c>32) // Nur Zeichen mit ASCII-Code oberhalb Leerzeichen
      {
        commandbuffer[i] = c;
        i++;
      }  
    }
  }
  if (strcmp(commandbuffer,"test")==0)
  {
    Serial.print("Kommando erkannt: ");
    Serial.println(commandbuffer);
  }
  else if (strcmp(commandbuffer,"")!=0)
  {
    Serial.print("Unbekanntes Kommando: ");
    Serial.println(commandbuffer);
  }
}

Hallo,

danke jurs das war genau das was ich gesucht hatte! :smiley:

Gruß
Jens

Hallo,

was wäre denn bzgl. eines nicht blockierenden Auslesevorgangs sinnvoll, sprich ohne Verwendung des bösen delays?

a) Sobald ein Zeichen reinkommt 100ms warten, dann den Buffer einmal am Stück auslesen und dessen Inhalt mit dem vorgegebenen String vergleichen.

b) Sobald ein Zeichen reinkommt innerhalb der nächsten 100ms den Buffer permanent auslesen und dessen Inhalt somit permanent mit dem vorgegebenen String vergleichen.

Gruß Chris

Man markiert einfach das Ende des Strings mit einem Endzeichen. Meistens LF oder CR. Man kann auch beides nehmen (da das oft zusammen gesendet wird) und nur auf eines abfragen. Den Code dazu habe ich hier schon zigfach gepostet.

@Lan-Police
C Strings kannst du nicht wie String Objekte behandeln. Die kannst du nicht mit == vergleichen oder mit = zuweisen. Statt dessen gibt es dazu Funktionen wie strcmp() (string compare) oder strcpy() (string copy)