INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
void loop-Absturz durch Endlosschleife
23.11.2020, 18:41 (Dieser Beitrag wurde zuletzt bearbeitet: 23.11.2020 18:47 von wonk.)
Beitrag #1
void loop-Absturz durch Endlosschleife
Hallo,
das folgende Programm läuft prinzipiell:
Code:
#include <ESP8266WiFi.h>
const char* ssid     = "meineSSID";
const char* password = "mein Passwort";
const char* host = "192.168.178.20";   // Adresse des Raspi
const uint16_t port = 80;             // Apache auf Raspi hört nur auf Port 80
WiFiClient klient;                    // instanziiert das Klientobject


void setup() {
  // Aufbau WiFi-Verbindung
  Serial.begin(115200);
  Serial.println("/n");
  Serial.print ("Verbinde zum WLAN-Netz: ");
  Serial.println(ssid);  //Zeiger!
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
    }
  Serial.println("");
  Serial.println("WiFi verbunden");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
// Aufbau Verbindung zum Server
  while (!klient.connect(host, port)) {
    Serial.print(".");
    delay(200);
    };
  Serial.println("");
  Serial.print("Verbunden mit Server ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  // This will send a string to the server
  Serial.println("sende zu Server: hello from ESP8266");
  if (klient.connected()) {
    klient.println("hello from ESP8266");
    };
  
  // wait for data to be available from remote server
  Serial.println("Warte max 5s auf Antwort des Servers");
  unsigned long timeout = millis();     //Zeit seit Prg.beginn
  while (klient.available() == 0) {    // solange keine Daten vom Remoteserver angekommen sind
    Serial.print(".");
    if (millis() - timeout > 5000) {    // falls Server nach 5s nicht geantwortet
      Serial.println ("");
      Serial.println("Server liefert keine Daten - versuche es erneut");    
      klient.stop();
      return;
    };
  };
  Serial.println ("");
  
  // Read all the lines of the reply from server and print them to Serial
   Serial.println("Erhalte vom Remote-Server:");
  while (klient.available()) {          // client hat noch Daten vom Remoteserver
    char ch = static_cast<char>(klient.read()); //staic_cast<char> bedeutet zwangsweise Typkonvertierung in char
    Serial.print(ch);
    }

  // Close the connection
  Serial.println();
  klient.stop();
  Serial.println("Server-Verbindung vom Client beendet");
  while ( true ) {                  // Endlosschleife als Programmende
  };  
}

Da es nur einmal durchlaufen werden soll, habe ich am Ende des void loop eine Endlosschleife eingebaut. Das führt aber zum Absturz und erneuter Ausführung von void loop. Fehlermeldung siehe Bild
   
Ohne die Endlosschleife gibt es keinen Absturz aber natürlich ständige Wiederholungen.
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2020, 18:50
Beitrag #2
RE: void loop-Absturz durch Endlosschleife
Zitat:Hallo,
das folgende Programm läuft prinzipiell:
#include <ESP8266WiFi.h>
...
Wenn das Programm nur einmal laufen soll, dann alles in setup() packen und die Endloschleife als void loop() {} notieren.

-- Aus dem Rheinwerk-Verlag: Arduino - Das umfassende Handbuch ISBN 978-3-8362-7345-9 --
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2020, 19:10
Beitrag #3
RE: void loop-Absturz durch Endlosschleife
Das ist zwar ein grausamer Programmierstil aber probier mal:
Code:
while(true) yield();

Ansonsten nimmt man eine Statusvariable, die man bei der Audführung setzt und nur wenn die nicht gesetzt ist, führt man aus.

Code:
bool status = false;
...
if (!status) {
  status = true;
  // mach was einmalig
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2020, 19:12
Beitrag #4
RE: void loop-Absturz durch Endlosschleife
(23.11.2020 18:50)ckuehnel schrieb:  Wenn das Programm nur einmal laufen soll, dann alles in setup() packen und die Endloschleife als void loop() {} notieren.
Hallo,
ist grundsätzlich klar, dass das so funktioniert.

Ich habe inzwischen herausgefunden, dass mein obiges Prg. mit delay (100) in der Endlosschleife nicht mehr zum Absturz führt. Anscheinend ist der ESP8266 sonst "zu schnell".
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2020, 19:24
Beitrag #5
RE: void loop-Absturz durch Endlosschleife
Das hat mit zu schnell nichts zu tun. Der Esp stürzt ab, wenn seine interne Firmware nicht regelmäßig aufgerufen wird. Das wird immer gemacht, bevor loop neu aufgerufen wird und auch im delay wird das regelmäßig gemacht.
Mit direktem Aufruf von yield() kann man das auch selbst machen ( wie in der Lösung von Tommy).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2020, 21:44
Beitrag #6
RE: void loop-Absturz durch Endlosschleife
Danke!
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Boot loop auf ESP32 nur mit JTAG-Reset zu stoppen miq19 13 1.146 28.01.2021 13:11
Letzter Beitrag: miq19
  D1 Mini - HTTPClient Problem Absturz/Neustart rev.antun 14 1.117 13.01.2021 15:59
Letzter Beitrag: Fips
Smile Frage zu Millis im Loop - ESP32 Stargazer 5 1.026 27.12.2020 06:41
Letzter Beitrag: N1d45
  ESP32-Cam, Loop Verständnisfrage Gould 5 1.332 26.06.2020 17:50
Letzter Beitrag: Gould
  Kein client.connected() durch direkte WiFi Verbindung zwei ESP8266MOD (Wemos D1 R1) n88 4 4.659 25.02.2018 14:57
Letzter Beitrag: n88
  Schäden durch Softwarereset möglich Franzel007 3 2.692 23.02.2018 08:16
Letzter Beitrag: Fips

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste