client.read() bringt nur "⸮" zurück.

Ich versuche via Tablet ein paar Daten per url params auf mein Arduino zu senden. Ich verwende ein ATWINC1500 WiFi Module.
Im folgenden code Ausschnitt, versuche ich nun die Daten des Clients zu empfangen.

Das Problem ist nun das ich folgendes Zeichen “⸮” erhalte und dies, so scheint es mir, in einer endlosen schleife.
Ich vermute dass

if (_client.available())

true ist weil da noch Daten im Buffer sind. Dies geschieht genau dann wenn ich das Tablet mit dem Arduino verbinde.

Ich denke das .read() den Buffer leeren sollte, scheint aber nicht den Fall zu sein. Wo mache ich hier einen Überlegungsfehler?

byte getLocalNetworkCredentials() {
  unsigned long startTime = millis();
  byte inputPos = 0;
  byte done = 0;


  while (done == 0) {

    // Exit menu with ESC
    if (getKeys() == 2) {
      waitForKeyRelease();
      return 2;
    }


    // Exit after 3 min. automatically
    if ((millis() - startTime) > 180000) {
      return 3;
    }


    WiFiClient _client = server.available();
    if (_client) {
      Serial.println(F("has client"));

      static char inputLine[100];
      while (_client.connected()) {
        if (_client.available()) {


          const byte inByte = _client.read();
          Serial.write(inByte);

          if (inByte == '\n') {
            inputLine[inputPos] = '\0';
            if (inputPos == 0) {
              _client.println("HTTP/1.1 200 OK");
              _client.println("Content-Type: application/json;charset=utf-8");
              _client.println("Cache-Control: no-cache");
              _client.println("Connection: close");
              _client.println();


              if (done == 1) {
                _client.println("{\"params\":\"OK\" }");
              } else {
                _client.print("{\"params\":\"NOK\", ");
                _client.print("\"error\": ");
                _client.print(done);
                _client.println("}");
              }


              _client.println();
              _client.flush();
              break;
            }

            if (memcmp(inputLine, "GET /config", 11) == 0) {
            //  done = processGet(inputLine);
            done = true;
            }


            inputPos = 0;
          } else if (inByte != '\r') {
            if (inputPos < (100 - 1)) {
              inputLine[inputPos++] = inByte;
            }
          }
        }
      }
      _client.stop();
    }
  }
  return done;
}

mysource: Ich denke das .read() den Buffer leeren sollte, scheint aber nicht den Fall zu sein.

read() liest 1 Zeichen aus dem Puffer, nicht den ganzen Puffer.

Gruß Tommy

stimmt, daher ist das ganze ja auch in einer while Schleife. Respektive, die while schleife ist solange am laufen wie der Client verbunden ist, und solange Daten im Buffer sind .available() werden diese ausgelesen. Jede Iteration ein Zeichen.

Ich werde mal schauen wie gross der Buffer ist. Sollte mit Serial.println(_client.available()); zu sehen sein.

Edit: nun dass sind zurzeit 156 Bytes, also wären das 156 Iterationen, dann wäre der Buffer leer solange ich mit dem Tablet nichts sende.

aber die While Schleife endet nie.

mysource: aber die While Schleife endet nie.

Kann sie ja auch nicht.

while (_client.connected())

ist immer noch erfüllt.

Gruß Tommy

Das ist klar, aber sobald ich doch das Tablet disconnected, auf ein andere SSID verbinde, sollte die Schleife abgebrochen werden, da der Client ja nicht mehr verbunden ist. Tut es aber auch nicht.

Da frage ich mich warum dies so ist. Warum wird dies vom WiFi Module nicht registriert?