Go Down

Topic: HTTP get auswerten?? :-( (Read 637 times) previous topic - next topic

ckerndl

Hallo,

ich will gerne an den Arduino mehrere werte gleichzeitig übergeben in der Form:

http://arduino/antwort=1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,1,1,2,3

Nur wie bekomme ich diese ausgewertet? Bzw ich brächte die am liebsten die Daten in einer char Variable




Code: [Select]
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    String buffer = ""; 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.print(c);   
        buffer+=c;       
        if (c == '\n') {
         
          currentLineIsBlank = true;
          buffer="";       
        } else if (c == '\r') {           
          if(buffer.indexOf("GET /?status=1")>=0){
  Serial.print("AN");
        }

          if(buffer.indexOf("GET /?status=0")>=0){
  Serial.print("aus");
          }
        }
        else {
          currentLineIsBlank = false;
        }   
      }
    }
    delay(1);
    client.stop();
  } 


da sollen die werte rein :-( ich sehen den Wald wohl vor lauter Bäumen nicht.

Code: [Select]
  Serial.println(buf[0]); 
  Serial.println(buf[1]); 
  Serial.println(buf[2]); 
  Serial.println(buf[3]);   
  Serial.println(buf[4]);
  Serial.println(buf[5]);
  Serial.println(buf[6]);
  Serial.println(buf[7]);
  Serial.println(buf[8]);
  Serial.println(buf[9]);
  Serial.println(buf[10]);
  Serial.println(buf[11]);
  Serial.println(buf[12]); 
  Serial.println(buf[13]); 
  Serial.println(buf[14]); 
  Serial.println(buf[15]); 
  Serial.println(buf[16]); 
  Serial.println(buf[17]); 
  Serial.println(buf[18]); 
  Serial.println(buf[19]);

michael_x

mit char meinst du sicher ein char array für mehr als einen Buchstaben.

einfacher als mit String buffer geht es mit

char buffer[80];

Das Programm-Findelkind würde dann beim Einlesen so aussehen
Code: [Select]

      ...
      int pos = 0;
      if (client.available()) {
        char c = client.read();
        Serial.print(c);   
        buffer[pos++]=c;       
        if (c == '\n') {
          currentLineIsBlank = true;
          pos = 0;       
        } else if (c == '\r') {
          pos=strstr(buffer,"wort=");             
          if(pos>=0)
          {
             Serial.print("ANTWORT: ");
             pos +=5; // an der ersten Zahl
             Serial.println (buffer+pos);
             DataArrayFill(buffer+pos);    // s. nächsten Abschnitt
          }


Jetzt musst du nur noch den Text in Zahlen umwandeln.
Dafür gibt es tausendundeine Möglichkeiten, die auch davon abhängen, welche Werte dein
1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,1,1,2,3
annehmen kann.

Code: [Select]
byte Data[4];

void DataArrayFill( char* buf )
{
    // füllt das globale array Data[4] mit den ersten vier Zahlen
    sscanf(buf, "%d,%d,%d,%d",Data, Data+1, Data+2, Data+3); 
}


Das ist nur ein Beispiel mit wenig Schreibarbeit für mich und diese Demo lässt dir noch viel übrig zum Rätseln, erweitern und googeln.

jurs


ich will gerne an den Arduino mehrere werte gleichzeitig übergeben in der Form:

http://arduino/antwort=1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,1,1,2,3

Nur wie bekomme ich diese ausgewertet? Bzw ich brächte die am liebsten die Daten in einer char Variable


Wenn Du die Daten in einem Char-Array haben möchtest, ist es zunächst einmal völlig kontraproduktiv, die Daten in ein per
String buffer = "";
deklariertes String-Objekt einzulesen statt gleich in ein char-Array.

Am besten stoppelst Du erstmal alle Zeichen zu Zeilen zusammen, die am Server ankommen (Zeilenende erkennbar am Zeilenendezeichen), und läßt sie Dir mit Serial.println ausgeben.

Bei einer Anfrage, die so aussieht:
http://arduino/antwort=1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,1,1,2,3
müßte dann irgendwie so eine Zeile (oder ähnlich) im HTTP-Header dabei sein, die mit GET anfängt:
GET /antwort=1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,1,1,2,3
Aus der Zeile mußt Du dann Deine Werte rausziehen.


ckerndl

aus der zeile würde ich mir ja gerne meine werte rausziehen wenn ich wüßte wie.

die werte können 0 bis 254 sein.

Code: [Select]
          if(buffer.indexOf("GET /?antwort=0")>=0){
           
          }


Das geht aber ich kann das ja nicht tausend mal hinschreiben :-(

Ich muss die Werte eben aufdrösseln

Mir würde es ja reichen wenn ich sagen könnte wenn einen Stringteil ausgeben bzw vergleichen könnte so im Sinne von wenn an stelle 5 bis 8 eine 253 dann schicke die Daten weg

Die Werte will ich dann weiterverarbeiten

Code: [Select]
  byte msg [] = { wert1,wert2,wert3,..................................};
  Serial.print(an); 
  Serial.print(von); 
  digitalWrite (ENABLERS485PIN, HIGH);  // enable sending
  sendMsg (fWrite, msg, sizeof msg);
  delayMicroseconds (660);
  digitalWrite (ENABLERS485PIN, LOW);  // disable sending 


Um die daten auf meinen RS485 Bus zu bekommen.

Wenn die Richtigen Daten am Arduino ankommen werden diese per HTTP weggeschickt nur ich will auch dinge auf dem Bus auslösen können.

jurs


aus der zeile würde ich mir ja gerne meine werte rausziehen wenn ich wüßte wie.


Ich habe hier im Forum schon diverse male meine getIntFromString Funktion gepostet:
http://arduino.cc/forum/index.php/topic,147168.0.html

Die arbeitet allerdings mit einem (Pointer auf) char-array als Parameter, und nicht mit einem String-Objekt.

Du müßtest im Prinzip zunächst die ganze Zeile bis zum Zeilenendezeichen in ein char-array einlesen, und dann könntest Du in einer Schleife mit meiner Funktion so viele Zahlenwerte rausziehen wie drin enthalten sind.


michael_x

Deinen letzten Code - Block denke ich, verstanden zu haben:
Die Werte aus der Zeile "GET ...... antwort= x,y,z,.... " sollen als Zahlen in das Array byte msg[],  damit  sendMsg sie senden kann.
x, y, z usw. sind Zahlen zwischen 0 und 255 (dezimal) und passen also jeweils in ein Byte.

Quote
Wenn die Richtigen Daten am Arduino ankommen werden diese per HTTP weggeschickt nur ich will auch dinge auf dem Bus auslösen können.

Das verstehe ich überhaupt nicht und ignoriere es einfach mal.

Quote

 if(buffer.indexOf("GET /?antwort=0")>=0){
         }
Das geht aber ich kann das ja nicht tausend mal hinschreiben :-(


indexOf geht nicht mit einem char [] , und was du tausendmal hinschreiben willst, verstehe ich nicht.
Was du brauchst, ist eine Funktion die dir sagt, ob du grade die Zeile gelesen hast, in der "antwort=" steht,
  und wenn ja, wo das steht, damit du den Rest "aufdröseln" kannst.
Bei den Bösen Strings wäre das die Funktion indexOf (und würde einmal gebraucht )
Bei char * oder  char [] geht das mit strstr und wurde dir als Beispiel heute um 4:44 PM fertig als Beispiel geliefert.
Welche Probleme hast du damit ?

Vermutlich kriegst du nur zuviele hilfreiche Antworten.

Das "Aufdröseln des Rests" wurde auch bereits mit meinem Demo-Beispiel teilweise gemacht. Welche Probleme hast du damit?
Das ist nun wirklich nur angedeutet gewesen, aber da kannst du dir auch jurs' Vorschlag ansehen,
oder nach anderen Lösungen sehen  (1001 Möglichkeiten ist etwas hoch gegriffen, ok. Trifft aber den Sachverhalt)


Go Up