mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik buffer in variabel speichern aber wie?


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin alle zusammen,

ich bin noch neuling was c angeht und verzweifel gerade daran etwas in 
einer variabel zu speichern. Hier mal der ganze code
 /**
 * StreamHTTPClient.ino
 *
 *  Created on: 24.05.2015
 *
 */

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;
uint8_t test;
void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
    USE_SERIAL.begin(115200);
    // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFiMulti.addAP("***", "*****");

}

void loop() {
    // wait for WiFi connection
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");

        // configure server and url
        http.begin("http://192.168.0.17/warp/anfrage.php/?id=151413");
        //http.begin("192.168.1.12", 80, "/test.html");

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {

                // get lenght of document (is -1 when Server sends no Content-Length header)
                int len = http.getSize();

                // create buffer for read
                uint8_t buff[128] = { 0 };

                // get tcp stream
                WiFiClient * stream = http.getStreamPtr();

                // read all data from server
                while(http.connected() && (len > 0 || len == -1)) {
                    // get available data size
                    size_t size = stream->available();

                    if(size) {
                        // read up to 128 byte
                        int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

                        // write it to Serial
                        USE_SERIAL.write(buff, c);
                        test = buff;
                        

                        if(len > 0) {
                            len -= c;
                        }
                    }
                    delay(1);
                }
                if(test) == "1") {
                          USE_SERIAL.write("ja");
                          delay(1000);                      // Wait for a second
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
                          delay(2000);
                          digitalWrite(LED_BUILTIN, LOW);
                           delay(1000);                      // Wait for a second
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
                          delay(2000);
                          digitalWrite(LED_BUILTIN, LOW);
                           delay(1000);                      // Wait for a second
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
                          delay(2000);
                          digitalWrite(LED_BUILTIN, LOW);
                           delay(1000);                      // Wait for a second
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
                          delay(2000);
                          digitalWrite(LED_BUILTIN, LOW);
                           delay(1000);                      // Wait for a second
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
                          delay(2000);
                          digitalWrite(LED_BUILTIN, LOW);
                        } else {
                          digitalWrite(LED_BUILTIN, HIGH);
                          USE_SERIAL.write("nein");
                        }
                USE_SERIAL.println();
                USE_SERIAL.print("[HTTP] connection closed or file end.\n");

            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(10000);
}
es geht um folgenden bereich
 int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

                        // write it to Serial
                        USE_SERIAL.write(buff, c);
                        test = buff;

wie bekomme ich buff in eine Variabel damit ich sie auch noch außerhalb 
der while schleife benutzen kann? So wie ich es mache anscheind nicht. 
brauche nur das letzte zeichen von buff deswegen überschreibe ich test 
solange bis die schleife durch ist ;).

LG Sven

Autor: aSma>> (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,
gucke bei Rheinwerk Computing c nach: Stichwort arrays.

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven schrieb:
> wie bekomme ich buff in eine Variabel damit ich sie auch noch außerhalb
> der while schleife benutzen kann? So wie ich es mache anscheind nicht.
> brauche nur das letzte zeichen von buff deswegen überschreibe ich test
> solange bis die schleife durch ist ;).

Wenn Du nur ein einziges Zeichen brauchst, dann sollte das so gehen. Die 
Variable test ist global angelegt und behält somit ihren Wert auch dann, 
wenn der entsprechende Code-Block verlassen wurde.

Was genau geht denn nicht? Ist es dieser Vergleich hier?
if(test == "1")

Das könnte daran liegen, dass "1" ein String-Literal ist. Strings 
vergleicht man generell mit strcmp() und nicht per Vergleichsoperator. 
Abgesehen davon, dass die Variable test nicht für einen String angelegt 
ist.

Wenn Du auf ein einzelnes ASCII-Zeichen vergleichen möchtest, welches 
die Ziffer 1 repräsentiert, dann eher so:
if(test == '1')  // Die Anführungszeichen machen den Unterschied

Übrigens ist da bei Dir im Code eine schließende Klammer zuviel.

: Bearbeitet durch User
Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine Variable innerhalb einer { } Struktur deklarierst, ist sie 
auch nur innerhalb dieses Bereiches gültig.
Du musst dein array also einfach weiter oben deklarieren, z.B. direkt 
nach
void loop() {
damit sie innerhalb der gesamten Funktion loop() verfügbar ist.


Dein Programm wird allerdings aus setup() nie herauskommen.
for(uint8_t t = 4; t > 0; t--)

ein uint8_t ist immer größer 0.
aus 0-1 wird 255

Autor: Eric B. (beric)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Joe F. schrieb:
> Dein Programm wird allerdings aus setup() nie herauskommen.
> for(uint8_t t = 4; t > 0; t--)
>
> ein uint8_t ist immer größer 0.
> aus 0-1 wird 255

Ein uint8_t ist immer größer oder gleich 0.
Somit ist es keine Endlosschleife.

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Eric B. schrieb:
> Ein uint8_t ist immer größer oder gleich 0.
> Somit ist es keine Endlosschleife.

Ups, stimmt, danke für die Korrektur.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.