hallo,
danke, der test hat immerhin schon funktioniert:
Die Seite wird jetzt nach delay(1000) ca. 1 sec lang angezeigt und danach dann abgebrochen mit derselben obigen Fehlermeldung.
Was kann man jetzt machen?
hallo,
danke, der test hat immerhin schon funktioniert:
Die Seite wird jetzt nach delay(1000) ca. 1 sec lang angezeigt und danach dann abgebrochen mit derselben obigen Fehlermeldung.
Was kann man jetzt machen?
ich korrigiere meine Aussage, erst flush(), dann RX leer machen, dann delay(1000), dann stop()
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
danke, nur verstehe ich jetzt noch nicht was genau wohin soll,
kannst du da mal bitte direkt in meinem Code korrigieren und in code tags posten?
edit: was bedeutet z.B. auch "RX leer machen"?
das macht bis jetzt noch keinen Unterschied (bricht ebenfalls wieder nach ca. 1 sec. ab, ohne delay(1000) auch wieder sofort)...Code://stopping client client.flush(); delay(1000); // debug client.stop();
Code:bool authorized=false; void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); //--------------------------------------- // debug // authorized=true; strcpy(strinput, ""); strcpy(strupwd, ""); strcpy(struname, ""); while ( client.connected() ) { if (authorized) return; if ( client.available() ) { char c = client.read(); //read char by request readString = ""; while ( (readString.length() < TOKLEN) && (c != '\n') ) { readString += c; c = client.read(); } readString.toCharArray(strinput, MAXLEN); // cstringarg(strinput, "uname", struname); // uname // cstringarg(strinput, "upwd", strupwd); // upwd if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL) { authorized = true; readString = ""; return; // return; // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert } //if HTTP request has ended if (c == '\n') { //now output html data header String script = ""; script += ("HTTP/1.1 200 OK \n"); script += ("Content-Type: text/html \n"); script += ("\n"); // do not forget this one //???? script += ("<!DOCTYPE html> \n"); script += ("<html> \n"); script += ("<head> \n"); // utf-8 für "°" Zeichen script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ; script += "<title>" ; script += "</title> \n" ; script += "</head> \n" ; script += "<body> \n" ; script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n"); script += ("<FORM ACTION='/' method=GET > \n"); script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2><INPUT TYPE=SUBMIT></h2> \n"); script += ("</FORM> \n"); script += ("<BR> \n"); script += ("</body> \n"); script += ("</html> \n"); client.print(script); //stopping client client.flush(); delay(1000); // debug client.stop(); //clearing string for next read //readString = ""; } } delay(1); } }
Geändert von HaWe (21.10.2019 um 15:11 Uhr)
Ich hatte nochmal bei flush() nachgelesen. Mein Verständnis war jetzt so: Es soll Zeichen, die noch nicht übertragen wurden, aus dem Puffer entfernen. Ich würde erst client.print(..), dann delay(...), dann client.flush(), dann client.stop().
so?Code:bool authorized=false; void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); //--------------------------------------- // debug // authorized=true; strcpy(strinput, ""); strcpy(strupwd, ""); strcpy(struname, ""); while ( client.connected() ) { if (authorized) return; if ( client.available() ) { char c = client.read(); //read char by request readString = ""; while ( (readString.length() < TOKLEN) && (c != '\n') ) { readString += c; c = client.read(); } readString.toCharArray(strinput, MAXLEN); // cstringarg(strinput, "uname", struname); // uname // cstringarg(strinput, "upwd", strupwd); // upwd if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL) { authorized = true; readString = ""; return; // return; // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert } //if HTTP request has ended if (c == '\n') { //now output html data header String script = ""; script += ("HTTP/1.1 200 OK \n"); script += ("Content-Type: text/html \n"); script += ("\n"); // do not forget this one //???? script += ("<!DOCTYPE html> \n"); script += ("<html> \n"); script += ("<head> \n"); // utf-8 für "°" Zeichen script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ; script += "<title>" ; script += "</title> \n" ; script += "</head> \n" ; script += "<body> \n" ; script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n"); script += ("<FORM ACTION='/' method=GET > \n"); script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2><INPUT TYPE=SUBMIT></h2> \n"); script += ("</FORM> \n"); script += ("<BR> \n"); script += ("</body> \n"); script += ("</html> \n"); client.print(script); delay(1000); // debug //stopping client client.flush(); client.stop(); //clearing string for next read //readString = ""; } } delay(1); } }
das macht auch noch genau dieselben Fehler sowohl mit als auch ohne delay(1000);
Geändert von HaWe (21.10.2019 um 15:12 Uhr)
mal so versuchen:
stattCode:while (client.connected()){} client.stop();
Code:delay(1000); // debug //stopping client client.flush(); client.stop();
PS: ich habe glaub ich kein nodeMCU mit Version 2.5.x
flush löst nur das senden verbleibender Bytes aus dem FIFO/internen Puffer aus (ungefähr wie beim trennen eines USB DAtenträger um keine Daten im Puffer zu verlieren)
delay kommt danach, da die daten auch erst übertragen werden müssen
dann sollte man folgende Schleife einbauen
und DANN erst schließenCode:while(client.connected()) { while(client.available()) { Serial.write(client.read()); } }
das Serial.write() ist nur zu Debugzwecken und du kannst einfach in eine dummy variable auslesen wenn die restlichen Daten unwichtig sind, abe erstmal mit Debug Ausgabe um zu wissen ob der Browser überhaupt noch was sendet
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
jaaa...!Code:bool authorized=false; void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); //--------------------------------------- // debug // authorized=true; strcpy(strinput, ""); strcpy(strupwd, ""); strcpy(struname, ""); while ( client.connected() ) { if (authorized) return; if ( client.available() ) { char c = client.read(); //read char by request readString = ""; while ( (readString.length() < TOKLEN) && (c != '\n') ) { readString += c; c = client.read(); } readString.toCharArray(strinput, MAXLEN); // cstringarg(strinput, "uname", struname); // uname // cstringarg(strinput, "upwd", strupwd); // upwd if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL) { authorized = true; readString = ""; return; // return; // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert } //if HTTP request has ended if (c == '\n') { //now output html data header String script = ""; script += ("HTTP/1.1 200 OK \n"); script += ("Content-Type: text/html \n"); script += ("\n"); // do not forget this one //???? script += ("<!DOCTYPE html> \n"); script += ("<html> \n"); script += ("<head> \n"); // utf-8 für "°" Zeichen script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ; script += "<title>" ; script += "</title> \n" ; script += "</head> \n" ; script += "<body> \n" ; script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n"); script += ("<FORM ACTION='/' method=GET > \n"); script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2><INPUT TYPE=SUBMIT></h2> \n"); script += ("</FORM> \n"); script += ("<BR> \n"); script += ("</body> \n"); script += ("</html> \n"); client.print(script); while(client.connected()) { delay(10); /* while(client.available()) { Serial.write(client.read()); } */ } delay(100); client.stop(); // edited //clearing string for next read //readString = ""; } } delay(1); } }
das hat jetzt zum ersten Mal gefunzt!
Das werde ich jetzt ausgiebig testen und dann berichten!
Tausend Dank auf jeden Fall schon einmal an euch beide!
Geändert von HaWe (21.10.2019 um 16:16 Uhr)
KORREKTUR !!
update:
ich hatte noch das alte
vor dem client.close() mit drin, aber nun rausgelöscht....:Code:while(client.connected()) { delay(10); }
UND JETZT schaltet er korrekt nach dem 1. Enter/Button Click durch!
4x nachgetestet, nach Neustart und zwischen-Abort, immer ok!
Ich verneige mich - und werde es jetzt noch über ein paar Stunden weiter testen+beobachten!
Tausend Dank!
Lesezeichen