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


von Sven (Gast)


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
1
 /**
2
 * StreamHTTPClient.ino
3
 *
4
 *  Created on: 24.05.2015
5
 *
6
 */
7
8
#include <Arduino.h>
9
10
#include <ESP8266WiFi.h>
11
#include <ESP8266WiFiMulti.h>
12
13
#include <ESP8266HTTPClient.h>
14
15
#define USE_SERIAL Serial
16
17
ESP8266WiFiMulti WiFiMulti;
18
uint8_t test;
19
void setup() {
20
    pinMode(LED_BUILTIN, OUTPUT);
21
    USE_SERIAL.begin(115200);
22
    // USE_SERIAL.setDebugOutput(true);
23
24
    USE_SERIAL.println();
25
    USE_SERIAL.println();
26
    USE_SERIAL.println();
27
28
    for(uint8_t t = 4; t > 0; t--) {
29
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
30
        USE_SERIAL.flush();
31
        delay(1000);
32
    }
33
34
    WiFiMulti.addAP("***", "*****");
35
36
}
37
38
void loop() {
39
    // wait for WiFi connection
40
    if((WiFiMulti.run() == WL_CONNECTED)) {
41
42
        HTTPClient http;
43
44
        USE_SERIAL.print("[HTTP] begin...\n");
45
46
        // configure server and url
47
        http.begin("http://192.168.0.17/warp/anfrage.php/?id=151413");
48
        //http.begin("192.168.1.12", 80, "/test.html");
49
50
        USE_SERIAL.print("[HTTP] GET...\n");
51
        // start connection and send HTTP header
52
        int httpCode = http.GET();
53
        if(httpCode > 0) {
54
            // HTTP header has been send and Server response header has been handled
55
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
56
57
            // file found at server
58
            if(httpCode == HTTP_CODE_OK) {
59
60
                // get lenght of document (is -1 when Server sends no Content-Length header)
61
                int len = http.getSize();
62
63
                // create buffer for read
64
                uint8_t buff[128] = { 0 };
65
66
                // get tcp stream
67
                WiFiClient * stream = http.getStreamPtr();
68
69
                // read all data from server
70
                while(http.connected() && (len > 0 || len == -1)) {
71
                    // get available data size
72
                    size_t size = stream->available();
73
74
                    if(size) {
75
                        // read up to 128 byte
76
                        int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
77
78
                        // write it to Serial
79
                        USE_SERIAL.write(buff, c);
80
                        test = buff;
81
                        
82
83
                        if(len > 0) {
84
                            len -= c;
85
                        }
86
                    }
87
                    delay(1);
88
                }
89
                if(test) == "1") {
90
                          USE_SERIAL.write("ja");
91
                          delay(1000);                      // Wait for a second
92
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
93
                          delay(2000);
94
                          digitalWrite(LED_BUILTIN, LOW);
95
                           delay(1000);                      // Wait for a second
96
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
97
                          delay(2000);
98
                          digitalWrite(LED_BUILTIN, LOW);
99
                           delay(1000);                      // Wait for a second
100
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
101
                          delay(2000);
102
                          digitalWrite(LED_BUILTIN, LOW);
103
                           delay(1000);                      // Wait for a second
104
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
105
                          delay(2000);
106
                          digitalWrite(LED_BUILTIN, LOW);
107
                           delay(1000);                      // Wait for a second
108
                          digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
109
                          delay(2000);
110
                          digitalWrite(LED_BUILTIN, LOW);
111
                        } else {
112
                          digitalWrite(LED_BUILTIN, HIGH);
113
                          USE_SERIAL.write("nein");
114
                        }
115
                USE_SERIAL.println();
116
                USE_SERIAL.print("[HTTP] connection closed or file end.\n");
117
118
            }
119
        } else {
120
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
121
        }
122
123
        http.end();
124
    }
125
126
    delay(10000);
127
}
es geht um folgenden bereich
1
 int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
2
3
                        // write it to Serial
4
                        USE_SERIAL.write(buff, c);
5
                        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

von aSma>> (Gast)


Lesenswert?

Servus,
gucke bei Rheinwerk Computing c nach: Stichwort arrays.

von Mark B. (markbrandis)


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?
1
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:
1
if(test == '1')  // Die Anführungszeichen machen den Unterschied

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

: Bearbeitet durch User
von Joe F. (easylife)


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
1
void loop() {
damit sie innerhalb der gesamten Funktion loop() verfügbar ist.


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

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

von Eric B. (beric)


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.

von Joe F. (easylife)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.