String kette erzeugen

Hallo,
ich bekomme zeichenweise aus einem http-responce Werte geliefert und muss bestimmte davon zusammenhängen.

ich habe es mit mit

char responce_DB .= response;

versucht, bekomme jedoch eine Fehlermeldung.

ich dachte mit .= kann man eine Zeichenkette erzeugen?

Gruß Jürgen

Kannst du uns die genaue Fehlermeldung nennen ?

Zeichenketten werden entweder statisch mit

char str[40];

definiert. (40 Zeichen, von 0 - 39) oder mit

char *str;

Aber ohne deine genaue Fehlermeldung, können wir nur raten.

Du meinst vielleicht += aber das geht nur mit Objekten. Eine Klasse kann einen Operator überladen und dann damit etwas spezielles machen. Ansonsten kannst du aber nicht einfach auf einen String einen Wert addieren.

In C sind Strings nichts anderes als Null-terminierte char Arrays. Du kannst also einen Index mitzählen und einfach mit [] addressieren. Siehe hier:
http://forum.arduino.cc/index.php?topic=233883.msg1684623#msg1684623

Ist da für Serial, aber geht genauso mit anderen Quellen. Man muss nur das Ziel-Array groß genug machen

Hallo,

ich habe es mit strcat und diesem Code probiert

hat leider den Fehler "invalid conversion from 'char' to const Char
gebracht

while (client.available())
        { 
          char response = client.read();
          Serial.print(" das ist der response");
          char response_single = response;
          //char response_sum .= response_single;
          Serial.print(response);
          if (response == '1'){
            int x = x + 1;
           // char response_DB;
            //response_DB = '';
            if (x >= '4'){
              char buffer1[40];
              char * ptr;
            /* Call strcat with buffer1 and " program" */
              ptr = strcat( buffer1, response );
              printf( "strcat : buffer1 = \"%s\"\n", buffer1 );
              //strcat(response_DB, response); 
            }else
            {
              X = '0';
            }   
          } 
        }

es geht um folgendes.
In einem Http-Response wird mir eine Zeichenkette übermittelt.
Durch die while schleife wird der response zeichen für zeichen gelesen.
irgendwann kommt er dann auf 1111 wenn also die 1 vier mal kommt soll der rest zu einem string zusammengefügt werden.
bzw. alles was ab der 1111 bis zum ersten zeichen '-' kommt ist ein Wert, dann kommt wieder ein Wert bis zum nächsten '-' usw.

Vielen Dank für die Hilfe

Jürgen

Serenifly:
Du meinst vielleicht += aber das geht nur mit Objekten. Eine Klasse kann einen Operator überladen und dann damit etwas spezielles machen. Ansonsten kannst du aber nicht einfach auf einen String einen Wert addieren.

In C sind Strings nichts anderes als Null-terminierte char Arrays. Du kannst also einen Index mitzählen und einfach mit [] addressieren. Siehe hier:
String (objekt) vs. char array - #6 by jurs - Deutsch - Arduino Forum

Ist da für Serial, aber geht genauso mit anderen Quellen. Man muss nur das Ziel-Array groß genug machen

ich bildete mir das zumindest ein das es mit dem '.= ' war. kann sein das ich das bei php oder ähnlichem sah. sorry

was Du meinst wäre das ich alles i ein array schreibe oder?
das wollte ich eben nicht da ich das array dann wieder zusammensetzen muss

ich bekomme also in einer while schleife folgende werte

1
1
1
1
5
2
.
1
0

2
0
.
0
5

usw
im Endeffekt sind es die Werte 52.10 und 20.05 die ich daraus brauche
das ganze bekomme ich wenn 4 mal die 1111 (vielleicht ändere oich das noch in 4 mal ein x ) hintereinander kommt

Viele Grüße
Jürgen

Du musst den Unterschied zwischen einem char Array und einem char lernen. strcat() ist für zwei char Arrays. Oder anders ausgedrückt zwei char*

Schau dir das Beispiel an das ich oben verlinkt habe. Einen String setzt man zeichenweise mit [] und einem Index zusammen. Wie jedes andere Array auch. Du musst halt irgendwann mitbekommen wann du fertig bist. Also z.B. bis zu einem Linefeed oder einem bestimmten End-Zeichen einlesen.

was Du meinst wäre das ich alles i ein array schreibe oder?
das wollte ich eben nicht da ich das array dann wieder zusammensetzen muss

Das ist doch genau was du versuchst zu machen. Die einzelnen Zeichen zu einem String zusammenzusetzen. Ein String ist ein Array aus chars mit einem '\0' am Ende! Das ist in C ganz primitiv.

Serenifly:
Du musst den Unterschied zwischen einem char Array und einem char lernen. strcat() ist für zwei char Arrays. Oder anders ausgedrückt zwei char*

ich hatte es bis jetzt so verstanden das in einer variablen mit dem typ char ein string enthalten ist, also eine Verkettung von zeichen. In einem char array dachte ich das eigentlich das gleiche enthalten ist nur gibt es viele char register mit gleichen oder verschiedenen char einträgen.

Gut das der http response ein array ist wusste ich nicht

Schau dir das Beispiel an das ich oben verlinkt habe. Einen String setzt man zeichenweise mit [] und einem Index zusammen. Wie jedes andere Array auch. Du musst halt irgendwann mitbekommen wann du fertig bist. Also z.B. bis zu einem Linefeed oder einem bestimmten End-Zeichen einlesen.

das mit dem Beispiel habe ich mir angesehen
nur da kommt das nächste problemchen

ich habe es so probiert

 char text[40];
char text1[40]= response;
strncat(text,text1,sizeof(text));

dann bringt er den Fehler
array must be enclosed with a brace enclosed initializer

so wie ich strncat verstehe macht er frolgendes
text entspricht dem was zum schluss dabei raus kommt
text1 ist das was immer angehängt werden soll
und mit sizeof(text) mmmmhhh für mein empfinden müsste da eigentlich text1 drin stehen ... nur dort gibt es ja mal ein ende

oder?

Ein char ist ein signed Byte. Ein einzelnes Zeichen nach ASCII Codierung:

Ein C String ist ein Null-terminiertes Array aus char. Da Arrays wiederum nur syntaktischer Zucker für Zeiger sind, sind Array Variablen Zeiger auf das erste Element. Daher wird den ganzen String Funktionen ein char* übergeben.

Ein Array aus Strings ist ein zwei-dimensionales Array aus char.

Du kannst da nicht nicht strncat() verwenden. Die Funktion erwartet zwei null-terminierte C Strings (oder ein leeres Array als ersten Parameter). Sie funktioniert nicht mit einzelnen Zeichen, da es eben einen Unterschied zwischen char und char* gibt.

char text1[40]= response;

text1 ist ein Zeiger auf das erste Element des Array. Ein char* auf text1[0]. response ist ein char und damit hast du einen Typ-Konflikt.

Du musst daher sowas machen:

text[index] = client.read();

Und entsprechend den Index mitzählen. Wenn der Text fertig eingelesen wurde, muss man dann noch am Ende ein '\0' oder 0 (kein '0'!) anhängen, damit der String abgeschlossen ist. Oder man macht es wie in dem Code von jurs und macht am Anfang einmal memset() auf 0.

C Strings allgemein:

string.h.:

Das ist für Standard C auf dem PC, aber geht abgesehen von den scanf()/printf() Sachen auch so auf dem Arduino

gibt es da keine beispiele dafür wie ich das benötige.

wenn ich beispiele sehe dann passen die meist nicht für das was ich benötige ...
mist, das kann doch nicht eine wochenarbeit werden diesen string hier das zu entlocken was ich brauche

das Problem geht ja noch weiter

wenn ich z.B. 1111 an den response anhänge und dann kommen meine werte und ich frage dann nach einer 1 ab
dann klappt das ja auch nicht wenn irgendwo im http-response eine 1 zwischendrin auftaucht ich müsste dann wenn <> 1 schon wieder die variable auf null setzen

das ist ja total umständlich. Ich glaube wenn man es weiss wie es geht dann ist das mit 3-4 zeilen code erledigt oder

ich bräuchte mal ein besipiel wie man aus so einem char array das herauszieht was man braucht

und wo soll ich ein \0 anhängen?
an den response den ich vom php-scrip absende?
macht ja nur dort sinn oder?

ps. Danke für die Links ... die sind gut!

Der Code von jurs ist in etwa was du willst. Das ist da von Serial eingelesen, aber geht analog auch mit Ethernet.

Du kannst es ja erst mal von Serial nehmen und die Konvertierung so anpassen wie du es brauchst. Das ist vielleicht zum Üben erst mal einfacher. Da kannst du einfach Text auf dem Serial Monitor eingeben und parsen.

Wo ist das Problem dabei den ganzen Text einzulesen? Wieso ist da eine Synchronisierung auf "1111" nötig? Ich dachte du schickst nur einen kurzen String als Antwort. Selbst wenn du mehr Text am Anfang hättest, kann man immer noch mit strstr() einen Teil-String suchen und dann den Text dahinter bearbeiten. Der Puffer muss dann natürlich größer sein, was mehr Speicher kostet.

Ansonsten kann man es schon machen, dass man zählt ob viermal hintereinander ein bestimmtes Zeichen eingetroffen ist und alles vorher verwirft. Dazu musst du aber noch das aktuelle Zeichen mit dem vorherigen vergleichen. Und wenn die drei mal gleich waren hast du es.

und wo soll ich ein \0 anhängen?
an den response den ich vom php-scrip absende?

Auf dem Arduino. Wenn der String ganz da ist. Letzteres musst du irgendwie feststellen. Eben zum Beispiel durch ein Linefeed am Ende oder ein anderes Zeichen, das im Text nicht vorkommt. Kann z.B. auch ein 'E' sein, wenn du nur Zahlen und Satzzeichen überträgst

Es gibt aber auch sowas:
http://playground.arduino.cc/Code/TextFinder

Damit kann man direkt in einem Stream nach Text suchen und auch Zahlen extrahieren. Es schadet dir aber auch nichts zu lernen das per Hand zu machen, da dir einige Grundlagen in C fehlen.

habe gerade alles getippt und dann war die session hier zu ende so ein mist

hier also das was ich im arduino vom http-response bekomme

am ende siehst du die Zeichenkette die ich brauche

am Anfang kommt der ganze http-header den ich nicht brauche und so lange durchlaufen lassen muss bis eben mein zeichen kommt
die 1111 ist glaub ich nicht so gut

geht auch ein "@" ?

Verbunden...sende Daten...fertig!
HTTP/1.1 200 OK
Date: Tue, 22 Apr 2014 23:22:47 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Vary: Accept-Encoding
Content-Length: 20
Content-Type: text/html

1111-351-22.60-37.70
disconnecting.

ein "@" zeichen geht auch... das macht dies schon ein wenig einfacher

hast Du den Link zu dem Beispielcode von jurs?

durch die 10000 seiten die ich nun durchgeklickt habe , habe ich total den überblick verloren

ach ja noch eine wichtige Frage.

das response-array läuft ja durch eine while schleife
es wird also der zähler im array hochgezählt
ich will nun zwischendrin nach "@" abfrage da ich dann weiss was alles danach kómmt ich auch benötige
jetzt müsste ich zu diesem zeitpunkt den wert im array-zähler wissen z.B. response[299]
ich könnte dann nämlich eine for schleife machen und ab 300 zu zählen beginnen bis "\o"

oder?

http://forum.arduino.cc/index.php?topic=233883.msg1684623#msg1684623

Hauptsächlich die Methode SerialStringRead(). Das ganze muss man natürlich etwas anpassen, aber es geht um den Teil von man die Anzahl der Zeichen mitzählt und das aktuelle Zeichen im Array abspeichert.

Und das Endzeichen CR/13/'\r' muss man auf LF umstellen!! Also 10 oder '\n'

Wenn du dir Beispiele hier ansiehst:

siehst du auch dass da nicht viel anders ist. Man fragt auch mit if(client.available()) ab ob was da ist. Auf while solltest du verzichten, da das blockiert und die Übertragung wohl auch etwas dauert, wenn auch viel schneller als mit Serial.

Hier bietet es sich natürlich schon an auf den Anfang zu synchronisieren, damit man nicht alles abspeichern muss (ein paar hundert Bytes RAM für den Puffer sind nicht so toll. Vor allem nicht auf dem UNO). Das geht wie gesagt wenn du jedesmal den aktuellen char mit dem vorherigen vergleichst und zählst wie oft die gleich waren.

Alternativ könntest du wahrscheinlich auch die Anzahl der Linefeeds mitzählen. Jede Zeile sollte durch ein Linefeed ('\n') abgeschlossen werden wenn das so angezeigt wird. Nach x Linefeeds ist man in der Zeile x + 1. Danach kann man die restlichen Zeichen in ein Array einlesen.

Eine dritte Option ist nicht den ganzen Text zu speichern, sondern jede Zeile. Dann muss der Puffer nur so groß wie die längste Zeile sein und man zählt einfach mit wie viele Zeilen man empfangen hat.
Das ist beides etwas einfacher als auf eine bestimmte Sequenz zu warten.

Oder ja, einfach ein Zeichen, das im restlichen Text nicht vorkommt. @ könnte es da tun. Da gibt es einige Möglichkeiten.

ok danke werde mir das mal anschauen

das mit dem RAM habe ich nicht verstanden, wird der speicher nach dem job nicht wieder frei gemacht?
(ich habe den mega)
ich könnte also in einer while schleife nach der 7'ten Zeile anfangen die restlichen Zeichen in ein array zu schieben und dort wieder zusammenzusetzen?
das braucht dann weniger platz im RAM als wenn ich das ganze array durchlaufen lassen muss?
ist das so?

oder kann ich nicht gleich wenn ich "@" gefunden habe die array[zahl] abfragen um dann bei der nächst höheren weiter zu machen?
wie frage ich eigentlich die aktuelle array[zahl] ab?

ich könnte also in einer while schleife nach der 7'ten Zeile anfangen die restlichen Zeichen in ein array zu schieben und dort wieder zusammenzusetzen?

Ja, aber...

...mit while kann es sein dass der Code abbricht wenn nicht alles sofort da ist. Obwohl Ethernet natürlich schneller als Serial ist, braucht die Übertragung etwas Zeit. Das wird ja alles über SPI übertragen. Du kannst dann nicht nach dem ersten Zeichen gleich alles einlesen. Ständige Funktionsaufrufe kosten natürlich auch Zeit, aber so performant muss das hier nicht sein.
Man kann den Code etwas modifizieren indem man while macht um eventuell mehr in einem Rutsch zu lesen. Das würde sich hier anbieten, da man auf jeden Fall schneller als bei Serial ist. Aber da kann es auch sein, das nicht alles auf einmal da ist und man mehrmals abfragen muss bis man die ganze Zeile hat. Ich weiß aber auch nicht wie schnell die Ethernet Geschichte in diesem Zusammenhang genau ist.

Ich meine das so, dass du nicht denken solltest "ich nehme while um alles auf einmal einzulesen", sondern "ich nehme while um zu lesen was da ist, und dann ruft man eventuell mehrmals die Funktion auf bis man alles hat".

Man schaut dann mit client.avaible() nach ob was da ist. Wenn nein, bricht man die Funktion ab. Wenn ja, liest man den char ein und kehrt nach loop() zurück (oder ein while um mehr als ein char zu lesen). Wenn alles da ist, gibt die Funktion einen Zeiger auf das Array zurück. Ansonsten NULL. Wenn der Rückgabe-Wert also ungleich NULL ist, weiß man in loop(), dass man fertig ist. Wie gesagt ist der Code da für Serial, aber das sollte genauso mit Ethernet gehen. Man müsste allerdings noch überprüfen ob überhaupt eine Verbindung besteht.

Der Code von jurs liest das so ein:

  char c=client.read();
  if (c>=32 && charcount<sizeof(text)-1) 
  {
    text[charcount]=c;
    charcount++;
  }
  else if (c==10) 
  {
    charcount=0;
    return text;
  }

Darum könnte man ein while(client.available) legen um eventuell mehrere Zeichen in einem Rutsch zu lesen. Es geht aber auch ohne, nur dann ein wenig langsamer. Bei Serial bringt das halt nichts, da die Zeichen 100-1000µs lang unterwegs sein können. Ob es sich hier lohnt weiß ich nicht. Du kannst es erst mal ohne probieren.

Bei dir kommt dann hier natürlich noch die Synchronisation auf das Startzeichen hinzu

Der Speicher würde schon wieder freigeben werden werden er lokal auf dem Stack wäre. Aber das geht bei der Polling-Version nicht, da er über die Funktionsaufrufe hinaus persistent sein muss. Aber so oder so ist es in diesem Fall Unsinn den ganzen Header einzulesen. Maximal braucht man Speicher für die längste Zeile. Und da auch nur wenn du jede Zeile einlesen würdest, was du nicht machst.

oder kann ich nicht gleich wenn ich "@" gefunden habe die array[zahl] abfragen um dann bei der nächst höheren weiter zu machen?

Es gibt wie gesagt mehrere Möglichkeiten. Das ist eine andere Option.

Allerdings wird vor dem @ gar nichts im Array abgespeichert. Man liest das Zeichen mit read() und schaut was es ist. Der Index steht solange auf 0! Wenn dann das @ kommt, setzt man eine boolean auf true damit man weiß dass man jetzt speichern muss. Dann wird das nächste Zeichen in array[index] geschrieben, also array[0]. Dann inkrementiert man den Index und er steht auf 1, usw.

Dann liest man solange ein bis ein LF kommt (c == '\n') oder (c == 10). Dann ist die Zeile zu Ende und man setzt den Index wieder auf 0 und den boolean auf false.

Serenifly:

...mit while kann es sein dass der Code abbricht wenn nicht alles sofort da ist.

aha, ok.
eine Frage:
Das mit dem Abbruch macht mich jetzt doch stutzig.
Folgendes ist schon ein paar mal passiert.
wenn ich den Code auf den Mega übertragen habe und den SerialMonitor aufgerufen habe um mir den response anzusehen hat er schon ein paar mal abgebrochen.
Entweder ich habe nur (der Code liest ja auch noch Sensor-werte ein und gibt diese aus und am Schluss fragt er noch die Datenbank ab und bekommt den response) die Sensorwerte gesehen und er hat dann abgebrochen bevor er den response eingelesen hat bzw. dabei war und keine Antwort oder ähnliches bekamn (evtl. zu lange gedauert, weiss nicht genau was passiert ist) oder der Monitor ist gleich ganz weiß geblieben.
habe ich den Monitor nochmals gestartet, hat es geklappt.
Wenn der Monitor aufgerufen wird, dauert es ca.
2 Sekunden bis die Sensorwerte da sind
dann wartet er und es dauert gefühlte 3-5 Sekunden bis der Response kommt

Ich vermute und ich gehe schwer davon aus, dass wenn ich mal das Programm halbwegs fertig habe das ich dann eh 1000 unsinnige Sachen reinprogrammiert habe.

Dann liest man solange ein bis ein LF kommt (c == '\n') oder (c == 10). Dann ist die Zeile zu Ende und man setzt den Index wieder auf 0 und den boolean auf false.

ich werde das heute Abend gleich mal testen.

Frage:
aktuell suche ich mir alles umständlich übers Netz zusammen.
Mein großes Problem dabei sind die Fachbegriffe.
Ich komme ja nicht als ein geschulter Programmierer der die Dachbegriffe über Jahre sich angearbeitet hat oder sie gleich auf einer Schule richtig gelernt hat. Aus diesem Grund suche ich oft Stunden was im Netz zusammen bis ich die Lösung oder das richtige Beispiel habe.
Als ich früher mal was mit Netzwerken zu tun hatte half mir u.a. das Buch TCP/IP for Dummis.
Ich glaube demnächst soll auch so ein Buch für Arduino in Deutsch heraus kommen.
Als ich dann das TCP/IP for Dummis gelesen hatte wurde mir vieles klarer und erst dann halfen mir komplexe Fachbücher aus dem O'Reilly Verlag. Hier gibt es ja auch ein umfangreiches für Arduino.

Hast Du hier eine Empfehlung?

Für ANSI C sieht das hier recht gut aus:

Das Buch ist ausführlicher als was auf der Webseite steht. Das ist nicht speziell für den Arduino, aber es geht eher auf die Grundlagen der Sprache ein. Der Code geht natürlich nicht 100%ig auf dem Arduino, aber die Prinzipien sind gleich.

Das ist ANSI C, aber der reine C++ Teil hält sich auf dem Arduino in Grenzen. Und wenn man dann C++ Bücher sieht geht das sehr schnell in Richtung Objekt-orientierte Programmierung und Standard Template Library, was hier weniger relevant ist. Viele C++ Bücher gehen davon aus, dass man schon etwas C kennt, reißen dann die Grundlagen nur an und steigen dann recht schnell in die Untiefen von C++ und OOP ein.

Es gibt auch Online ein paar gute Tutorials. Das hier ist auch nicht schlecht und für den Arduino:
http://www.elektronik-bastelkeller.de/C_Ardu_Inhalt.php

Was es noch an Büchern gibt, wurde u.a. hierbesprochen:
http://forum.arduino.cc/index.php?topic=218662.0
http://forum.arduino.cc/index.php?topic=206118.0

Da gibt es auch ein paar Bücher spezifisch für den Arduino (das O'Reilly Buch von Erik Bartmann wird oft empfohlen). Die gehen dann aber meistens weniger auf die C Grundlagen ein und behandeln mehr spezifische Aufgaben zu Hardware. Oder sie sind wie das "Powerprojekte" Buch von Franzis für AVR C geschrieben und nicht für die Arduino IDE.

Ideal wäre vielleicht ein Buch für Standard C und eins für den Arduino. Eines das am besten für alles ist, gibt es nicht!

wenn ich den Code auf den Mega übertragen habe und den SerialMonitor aufgerufen habe um mir den response anzusehen hat er schon ein paar mal abgebrochen.

Es geht halt darum, dass dass wenn du einfach auf available() abfragst erst mal nur ein Zeichen da ist. Dann gehst du schon davon aus, dass alles da ist und versuchst eventuell alles einzulesen, während die restlichen Zeichen noch unterwegs sind (entweder vom PC, oder zwischen einem Schnittstellen Shield und dem Arduino).

Man kann dann schon while verwenden falls doch mal mehrere Zeichen auf einmal im Puffer sein sollten, aber man muss trotzdem mehrmals nachsehen bis alles da ist. Da man nicht weiß wie lange die Übertragung ist, fragt man dann auf irgendein Zeichen am Ende ab.

Bei Serial ist das wie gesagt sehr gravierend, da das sehr, sehr langsam ist. Bei 9600 Baud dauert ein Zeichen 1ms! Ethernet ist schneller, aber ich bezweifle trotzdem, dass nach dem ersten Zeichen sofort alles im Puffer steht und ausgelesen werden kann.

Serenifly:
Der Code von jurs liest das so ein:

  char c=client.read();

if (c>=32 && charcount<sizeof(text)-1)
 {
   text[charcount]=c;
   charcount++;
 }
 else if (c==10)
 {
   charcount=0;
   return text;
 }

habe es jetzt mit diesem Code probiert

jetzt bringt er meine Daten gar nicht mehr

hier der output
zumindest alles in einem string

Verbunden...sende Daten...fertig!
HTTP/1.1 200 OKDate: Wed, 23 Apr 2014 19:47:53 GMTServer: Apache/2.2.22 (Debian)3 GMTX-Powered-By: PHP/5.4.4-14+deb7u8MTVary: Accept-Encoding.4-14+deb7u8MTContent-Length: 17ing.4-14+deb7u8MTContent-Type: text/html-14+deb7u8MTContent-Type: text/html-14+deb7u8MT
disconnecting.

wo steckt denn da nur der Hund begraben... so ein mist :frowning:

Vorher waren es mehrere Zeilen so wie du es gepostet hast. Deshalb bin ich davon ausgegangen, dass da ein LF am Ende jeder Zeile steht. Jetzt scheinst du plötzlich nur noch ein LF ganz am Ende zu haben. Oder nur noch drei Zeilen. Aber irgendwie was anderes als was vorher da stand.

Dann probier mal die Version mit dem Start-Zeichen am Anfang. Vergleiche jedes eingelesen Zeichen z.B. mit dem '@' und wenn das da ist setze eine Variable wie "static boolean read" auf true. Wenn die dann true ist, lese in das Array ein. Wenn du fertig bist setze die Variable wieder auf false. Sollte theoretisch gehen.

So ähnlich:

  static boolean read;
 
  .....

  char c=client.read();

  if(c == '@')
      read = true;

  if(read)
  {
    if (c>=32 && charcount<sizeof(text)-1) 
    {
      text[charcount]=c;
      charcount++;
    }
    else if (c==10) 
    {
      charcount=0;
      read = false;
      return text;
    }
  }

EDIT: mit der Terminierung habe ich gerade durch den Code Ausschnitt was durcheinander gehauen. Jurs macht ja memset() vorher. Dann passt es. Persönlich mache ich es eher per Hand am Ende, aber das ist egal.

Hallo,

jetzt bringt er gar nichts mehr bzw. so wie es aussieht kann er auch nichts bringen der er kommt gar nicht bis zum "@"

siehe output (habe hier die "true-abfrage" mal rausgelassen um zu sehen welcher string kommt und in diesem string fehlt nicht nur das "@" sondern der ganze rest.
er bringt also nur den http-header und steigt dann schon aus

output

Verbunden...sende Daten...fertig!
HTTP/1.1 200 OKDate: Wed, 23 Apr 2014 20:57:01 GMTServer: Apache/2.2.22 (Debian)1 GMTX-Powered-By: PHP/5.4.4-14+deb7u8MTVary: Accept-Encoding.4-14+deb7u8MTContent-Length: 17ing.4-14+deb7u8MTContent-Type: text/html-14+deb7u8MTContent-Type: text/html-14+deb7u8MT
disconnecting.

hier der code (ohne if-abfrage da ich den output sehen wollte)

char c=client.read();
            static char text[81];
            static byte charcount=0;
            if(c == '@'){
                read = true;
            }
            
            //if(read)
            //{
              if (c>=32 && charcount<sizeof(text)-1) 
              {
                text[charcount]=c;
                charcount++;
              }
              else if (c==10) 
              {
                charcount=0;
                //read = false;
                Serial.print(text);
              }
            //}

ich glaube es liegt hier an dieser Abfrage

if (c>=32 && charcount<sizeof(text)-1)

ihn stört u.U das

sizeof(text)-1

oder

Dein Puffer hat nur Platz für 80 Zeichen. Durch das "charcount<sizeof(text)-1" wird abgebrochen, damit man nicht darüber hinaus schreibt. Was in C i.d.R. katastrophale Auswirkungen hätte.

Im Moment liest du alles in das Array ein. Wenn du auf das Startzeichen wartest, wird nicht der gesamte String gespeichert, sondern alles vor dem @ verworfen. Das ist ja der ganze Sinn der Sache. Du musst ja den Teil den du gar nicht willst nicht unbedingt speichern.

Entweder das, oder mache den Puffer größer.