String kette erzeugen

ich glaube wir haben es fast geschafft

es hängt wohl noch an einer kleinigkeit

also ich übergebe das '#' Zeich an den string im php script

hier der Code-ausschnitt

 $ergebnis = $res->fetch_object();
                                $binarydata = '@';
                                $binarydata .= '-';
                                $binarydata .= pack ('a4a6a5', $ergebnis->id.'-',$ergebnis->temp.'-',$ergebnis->hum);
                                $binarydata .= '#';
                                echo  $binarydata;

im browser sehe ich die Kontrollausgabe

@-385-22.00-56.00#

geht also

im arduino-sketch habe ich das geändert

  else if (response=='#') 
                  {
                       Serial.println("ich bin am ende des strings");
                     text[charcount] = '\0';
                    charcount=0;
                    read = false;
                    Serial.print(text);
                     // Serial.println("ich bin VOR der Pharsestring function");
                    parseString(text);
                  }

das ist die Ausgabe

DHT22 - Test!
27.04.2014
16:57:56
connecting...
jetzt der wasserstand
20.69
jetzt die temp ==>:
25.00
jetzt die Luftfeuchte ==>:
41.10
connected
Verbunden...sende Daten...fertig!
HTTP/1.1 200 OK
Date: Sun, 27 Apr 2014 14:52:38 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Vary: Accept-Encoding
Content-Length: 18
Content-Type: text/html

ich bin VOR response >=32......
ich bin in response >=32.......
@ich bin VOR response >=32......
ich bin in response >=32.......
-ich bin VOR response >=32......
ich bin in response >=32.......
3ich bin VOR response >=32......
ich bin in response >=32.......
8ich bin VOR response >=32......
ich bin in response >=32.......
7ich bin VOR response >=32......
ich bin in response >=32.......
-ich bin VOR response >=32......
ich bin in response >=32.......
2ich bin VOR response >=32......
ich bin in response >=32.......
5ich bin VOR response >=32......
ich bin in response >=32.......
.ich bin VOR response >=32......
ich bin in response >=32.......
0ich bin VOR response >=32......
ich bin in response >=32.......
0ich bin VOR response >=32......
ich bin in response >=32.......
-ich bin VOR response >=32......
ich bin in response >=32.......
4ich bin VOR response >=32......
ich bin in response >=32.......
1ich bin VOR response >=32......
ich bin in response >=32.......
.ich bin VOR response >=32......
ich bin in response >=32.......
1ich bin VOR response >=32......
ich bin in response >=32.......
0ich bin VOR response >=32......
ich bin in response >=32.......
#
disconnecting.

wie du siehst bekommt er zwar '#' geliefert
in der if-abfrage scheint esihn jedoch nicht zu interessieren
da er dort nie reinläuft

sonst müsste er im serial-monitor zumindest
das ausgeben

 Serial.println("ich bin am ende des strings");

irgendwie klappt die Abfrage mit dem Zeichen nicht

ARG! Das kann ja nicht gehen! ARG! Den Wald vor lauter Bäumen nicht gesehen. Das if-else ist mit der Abfrage auf >= 32 UND '#' völlig sinnlos, da '#' größer als 32 ist.

Lassen wir mal die Abfrage auf die Steuerzeichen weg. Es ist glaube ich unnötig die hier herauszufiltern

if (charcount < sizeof(text)-1)
{ 
    if (response != '#')
    {
          text[charcount]=response;
          charcount++;
    }
    else
    {
            //hier Code der am Ende aufgeführt wird
    }
}

ich habs
ich musste nur die if-anweisung tauschen

Serenifly:
ARG! Das kann ja nicht gehen! ARG! Den Wald vor lauter Bäumen nicht gesehen. Das if-else ist mit der Abfrage auf >= 32 UND '#' völlig sinnlos, da '#' größer als 32 ist.

Lassen wir mal die Abfrage auf die Steuerzeichen weg. Es ist glaube ich unnötig die hier herauszufiltern

if (charcount < sizeof(text)-1)

{
   if (response != '#')
   {
         text[charcount]=response;
         charcount++;
   }
   else
   {
           //hier Code der am Ende aufgeführt wird
   }
}

ach so hast Du das gelöst

ich habe die if-anweisung so vertauscht damit er zuerst auf '#' abfragt

 if (response=='#') 
                  {
                     text[charcount] = '\0';
                    charcount=0;
                    read = false;
                    Serial.print(text);
                    parseString(text);
                  } else if (response>=32 )
                  {
                    text[charcount]=response;
                    charcount++;
                  }

jetzt funktioniert es... GOTT und Serenifly sei Dank!!!

endlich
Danke für Deine wahnsinnige Geduld mit mir

Jetzt aber noch zwei/drei Fragen zum Verständnis
zu diesem Abschnitt

static char text[81];
            static byte charcount=0;

wieso 81 Zeichen? bezieht sich das auf den http-header der vom php-script kommt?
das sind doch mehr oder? ich hab sie noch nicht gezählt...
wenn dem so ist, kann man da einen sicherheitspuffer einbauen oder bleibt dieser header zu 100% immer gleich?

dann

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

wieso >= 32 ?

und response>=32 && charcount<sizeof(text)-1

da werden wohl nach >= 32 Zeichen abgefragt und dann 1 Zeichen abgezogen?
wieso?
oder ist das was ganz anderes mit gemeint?
Ps.
hast Du mal einen Link für mich indem ich sehe wie man sich nun aus einer Funktion
ein array mit dem Ergebnis übergeben lässt?

ich rufe ja aktuell daten_senden (wert1, wert2, wert3)
auf
in daten_senden rufe ich dann pharseString (text)
auf
dort werden mir nun sauber wie Werte ausgegeben

damit ich damit auch arbeiten kann brauch ich diese Werte ja

es müsste also so aussehen

array_mit_ergebnis = daten_senden(wert1,....);
temp = array_mit_ergebnis[0];
hum = array_mit_ergebnis[1];

oder noch besser
temp = array_mit_ergebnis[temp];
hum= array_mit_ergebnis[hum];

Ja, das geht natürlich auch. Gibt wie immer einige Varianten das hier zu lösen.

wieso 81 Zeichen? bezieht sich das auf den http-header der vom php-script kommt?
das sind doch mehr oder? ich hab sie noch nicht gezählt...
wenn dem so ist, kann man da einen sicherheitspuffer einbauen oder bleibt dieser header zu 100% immer gleich?

Das war mal willkürlich gewählt. Ich vorhin schon erwähnt, dass du eigentlich nur Speicher für deinen String + 1 brauchst. Kommt halt drauf an wie lang der ist. Wenn das alles ist, kannst du das auch auf z.B. 21 kürzen.

Die anderen Zeichen die davor ankommen (d.h. der Header) werden nicht abgespeichert, da erst ab dem @ in das Array geschrieben wird.

Man kann natürlich auch so Sachen machen wie das Datum und die Uhrzeit aus dem Header einlesen. Dann müsste man dann mehr speichern. Aber auch sonst wieder einiges ändern. Aber für den Fall kann der Header entfallen. Man muss ihn also nur aus dem Eingangspuffer auslesen und die Zeichen dann gleich verwerfen.

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

Mit dieser zusätzlich Abfrage auf 32 wäre die LF Variante aber glaube ich nicht gegangen. Selbst wenn da eins käme

wieso >= 32 ?

Die ersten 31 Zeichen sind nicht-darstellbare Steuerzeichen. Wie z.B. Linefeed oder Carriage Return. Damit werden die überlesen. Das hier nicht unbedingt nötig. Kommt immer drauf an was man genau gemacht. Gerade wenn man eben das LF verarbeiten will oder zur Darstellung braucht darf man es nicht überlesen. Der Teil stammt aus dem Code von jurs und ich hatte das halt einfach kopiert.

Die zweite Abfrage auf die Größe des Arrays ist, dass man keinen Pufferüberlauf produziert. Du kannst in C lustig über Array Grenzen hinweg in andere Speicher schreiben. -1 weil noch Platz für den Null-Terminator sein muss.

Serenifly:
Das war mal willkürlich gewählt. Ich vorhin schon erwähnt, dass du eigentlich nur Speicher für deinen String + 1 brauchst. Kommt halt drauf an wie lang der ist. Wenn das alles ist, kannst du das auch auf z.B. 21 kürzen.

ok habe ich begriffen
das bezieht sich auf den string um speicher zu sparen
gut da ich natürlich ab und an versch. od. versch. viele Werte erhalte muss ich das dann entsprechend anpassen
gut habe aber die logik verstanden

http://www.asciitable.com/

Die ersten 31 Zeichen sind nicht-darstellbare Steuerzeichen. Wie z.B. Linefeed oder Carriage Return. Damit werden die überlesen. Das hier nicht unbedingt nötig. Kommt immer drauf an was man genau gemacht. Gerade wenn man eben das LF verarbeiten will oder zur Darstellung braucht darf man es nicht überlesen. Der Teil stammt aus dem Code von jurs und ich hatte das halt einfach kopiert.

ok... um es zu begreifen
die 31 Zeichen sind das was nach dem http-header kommt und vor dem eigentlichen string also genau der zischenraum?

hoffe natürlich das der immer gleich ist und es nicht mal kracht wenn da mehr unsichtbare zeichen übertragen werden

Die zweite Abfrage auf die Größe des Arrays ist, dass man keinen Pufferüberlauf produziert. Du kannst in C lustig über Array Grenzen hinweg in andere Speicher schreiben. -1 weil noch Platz für den Null-Terminator sein muss.

das habe ich noch nicht ganz begriffen.. aber ok... das lese ich mir noch rauss

wenn du noch eine Link zu den arrays hättest so dass ich das ergebnis aus den zwei funktionen dann am ende in ein arry habe das wäre perfekt

mann bin ich froh das das jetzt mal sauber angezeigt wird
Danke!!!
jetzt geh ich mal zu Muttern was essen

Das hat nichts mit der Anzahl der Zeichen zu tun! Schau dir die ASCII Tabelle an. Ein char ist nichts anderes als ein signed Byte. Jeder char hat einen Wert zwischen 0 und 127. z.B. LF = 10, CR = 13, Leerzeichen = 32, '0' = 48, 'a' = 97.

Da wird der Wert des chars überprüft ob er ein Steuerzeichen ist (obwohl es genaugenommen noch DEL am Ende gibt). Und die Steuerzeichen dann überlesen. Das kann eben wieder Probleme machen man die Steuerzeichen dann doch braucht. Je nachdem wo die Abfrage genau sitzt.

wenn du noch eine Link zu den arrays hättest so dass ich das ergebnis aus den zwei funktionen dann am ende in ein arry habe das wäre perfekt

Musst du mehr als den int und die zwei floats abspeichern? Da das unterschiedliche Datentypen sind, gehen reine Arrays nicht. Da müsste sich wieder was anderes überlegen.

Ansonsten verwende einfach globale Variablen.

ja,
ich habe verschieden Datentypen.
floats, int und auch char

dann ist es wohl besser wenn ich mit globalen Variablen arbeite.

Ich werde mich jetzt mal dran machen den ganzen sketch so zu sortieren damit er einigermasen übersichtlich ist und dann werde ich meine ersten Abfragen starten mit denen ich dann im sketch arbeiten kann.

Das ich nun die Daten da habe hilft mir enorm.

vielen vielen Dank nochmal

du hast mir wirklich sehr geholfen obwohl ich manchmal fast verzweifelt wäre.

viele von den C Programmieren arbeiten ja mit visual studio ... gibt es auch eine freeware die gut ist...?
die IDE von Arduino ist ja ganz ok, aber wenn mein Programm nun umfangreicher wird wird es schon unübersichtlicher
Viele Grüße und Danke nochmal

Jürgen

Für den Arduino bräuchtest du noch das Visual Micro Plugin. Plugins gehen nicht mit der kostenlosen Express Version.

Die Alternative ist das Atmel Studio:

Und dann Visual Micro darüber:
http://www.visualmicro.com/

Oder vielleicht Code::Blocks Arduino:
http://arduinodev.com/codeblocks/

was hälst Du voin eclipse? dafür gibt es glaube ich auch ein Arduino plugin

ps..was ich gerade so auf die Schnelle im Netz fand dürfte wohl Atmel sehr gut sein als freeware... mit eclipse scheint es ab und an wohl Probleme zu geben

Eclipse als IDE ist sehr gut, aber die Installations-Anleitung für den Arduino hat mich doch sehr abgeschreckt:
http://playground.arduino.cc/Code/Eclipse

Da muss man anscheinend zig Einstellungen per Hand machen. Weiß nicht ob das inzwischen besser geht

genau.
aus diesem Grund bin ich gerade an der Atmel-Installation.. will mir nicht noch unnötig mehr Dinge aufbürden :slight_smile: