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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sven (Gast)


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
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)


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

von Mark B. (markbrandis)


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?
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)


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
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)


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.

von Joe F. (easylife)


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]
  • [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.