Forum: Mikrocontroller und Digitale Elektronik PlatformIO esp32-Beispiel compiliert nur mit funktionsprototyp


von Axel R. (axlr)


Lesenswert?

Hallo zusammen,
ich wollte auch mal was mit'm ESP32 machen.
Also mal ganz blauäugig ein Webserver-Beispiel kopiert und Auf den ESP 
geflasht.
Vorab kam allerdings:
1
Building in release mode
2
Compiling .pio\build\az-delivery-devkit-v4\src\main.cpp.o
3
src\main.cpp: In function 'void setup()':
4
src\main.cpp:39:18: error: 'handle_root' was not declared in this scope
5
   server.on("/", handle_root);
6
                  ^
7
*** [.pio\build\az-delivery-devkit-v4\src\main.cpp.o] Error 1

macht ja prinzipiell auch Sinn, weil der Funktionsprototyp fehlt, 
welchen man i.A. in der Main.h definiert? Also habe ich
void handle_root();
unterhalb der Variablendeklaration eingefügt, compiliert und 
funktioniert.
Meine Frage:
Weshalb lief das Beispiel aus og Link beim Autor ohne *.h-Datei?
oder: warum brauch ich in der Arduino-IDE keine Prototypen definieren?
noch anders gefragt: kann ich PlatformIO so konfigurieren, dass es 
ähnlich agiert, sodass ich eben keine "h.datei" brauche? kann man das 
irgendwo einstellen?
1
VSCODE_Version:
2
Version: 1.55.2
3
OS: Windows_NT x64 10.0.19042
4
5
PlatformIO:
6
Core 5.1.1·Home 3.3.4
7
8
standardkonfiguration:
9
env:az-delivery-devkit-v4]
10
platform = espressif32
11
board = az-delivery-devkit-v4
12
framework = arduino
13
upload_port = COM5
14
monitor_speed = 115200

Link zum Beispiel und kurzer getesteter Code:

https://www.hackster.io/electropeak/create-a-web-server-w-esp32-tutorial-a9a392
1
#include <Arduino.h>
2
#include <WiFi.h>
3
#include <WebServer.h>
4
5
6
const char* ssid = "FRITZ!Box 7412";           
7
const char* password = "Geheim_1234_öüä"; 
8
WebServer server(80);  // Object of WebServer(HTTP port, 80 is defult)
9
// HTML & CSS contents which display on web server
10
String HTML = "<!DOCTYPE html>\
11
<html>\
12
<body>\
13
<h1>My First Web Server with ESP32 - Station Mode &#128522;</h1>\
14
</body>\
15
</html>";
16
17
///
18
void handle_root(); //<== von mir eingefügt
19
///
20
21
void setup()
22
{
23
  Serial.begin(115200);
24
  Serial.println();
25
26
  WiFi.begin(ssid, password);
27
28
  Serial.print("Connecting");
29
      while (WiFi.status() != WL_CONNECTED) {
30
        delay(500);
31
        Serial.print(".");
32
      }
33
  Serial.println();
34
  Serial.print("Connected, IP address: ");
35
  Serial.println(WiFi.localIP());
36
  Serial.print("Got IP: ");
37
  Serial.println(WiFi.localIP());  //Show ESP32 IP on serial
38
  server.on("/", handle_root);
39
  server.begin();
40
 
41
  Serial.println("HTTP server started");
42
  delay(100);
43
}
44
void loop() {
45
server.handleClient();
46
}
47
48
void handle_root() {
49
server.send(200, "text/html", HTML); // Handle root url (/)
50
}

Herzlichen Dank, falls jemand was dazu sagen kann
Äxl

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Axel R. schrieb:
> sodass ich eben keine "h.datei" brauche

Brauchst du doch auch nicht, wie du ja selbst gezeigt hast.

Aber bevor du irgendeinen Namen verwendest, musst du ihn natürlich 
deklariert haben, wie sonst soll der Compiler wissen, was du mit 
diesem Namen verbindest?

Definieren musst du ihn nicht unbedingt an der gleichen Stelle, aber 
du darfst es. Wenn du also deine Definition von handle_root() vorziehst, 
sodass sie vor der ersten Benutzung steht, dann hast du damit zugleich 
die nötige Deklaration erschlagen.

Mit PlatformIO oder irgendwelchen anderen Build-Systemen hat das 
allerdings nichts zu tun, das ist grundlegendes C++-Verhalten.

von Johannes S. (Gast)


Lesenswert?

Im Arduino Universum ist das main doch ein Sketch und sollte 
mein-Programm.ino heißen. Dann pappt das Buildsystem die nötigen Header 
selber rein, das macht PIO imho genauso.

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.