Arduino als Server oder Client

Gast #3393076
Hallo Leute

Ich bin momentan an einem Übungsprojekt. Dabei geht es um die 
Ansteuerung eines Arduino Uno mit Ethernet Shield übers Internet.

Übers Internet kann eine 4stellige Zahlenkombination ans Arduino 
gesendet werden. Am Arduino sind zwei Taster angeschlossen, mit welchen 
man ebenfalls eine 4stellige Zahlenkombination eingeben kann. Stimmt die 
eingegebene Kombi mit der aus dem Netz gesendeten überein, leuchtet eine 
grüne LED, ansonsten eine Rote. Im Browser soll der angezeigt werden, ob 
die Kombination richtig eingegeben wurde oder nicht.

Momentan habe ich das so gelöst, dass das Arduino den Webserver spielt. 
Ein Client connected und sendet per POST Befehl die Zahlenkombination. 
Um den aktuellen Status auszulesen mache ich alle paar Sekunden einen 
GET Befehl. Soweit funktioniert alles bestens, einziges Problem ist, 
dass wenn ich die Zahlenkombination mit den Taster eingebe und 
gleichzeitig ein eine GET Anfrage kommt, die Eingabe für rund 2s 
blockiert ist.

Dies möchte ich nun so lösen, dass der Status nur gesendet wird, wenn er 
sich geändert hat.  Dazu müsste ich ja vom Arduino aus einen POST Befehl 
absetzen. Da das Arduino aber der Server ist, ist dies nicht möglich.

Nun meine Frage, wie könnte ich das lösen?

Danke für antworten.
#3393810
Stefan schrieb:
> Karl Heinz schrieb:
>> Stefan schrieb:
>>
>> Die Frage ist eher:
>>
>>> gleichzeitig ein eine GET Anfrage kommt, die Eingabe für rund 2s
>>> blockiert ist.
>>
>> Warum gibt es hier eine 2s Blockade?
>
> Karl Heinz schrieb:
>> Warum gibt es hier eine 2s Blockade?
>
> Weil die GET Anfrage bearbeitet und geantwortet wird.

Natürlich tut es das.
Aber das verbrät keine 2 Sekunden, wenn man es richtig macht :-)
#3393825
Karl Heinz schrieb:

>> Weil die GET Anfrage bearbeitet und geantwortet wird.
>
> Natürlich tut es das.
> Aber das verbrät keine 2 Sekunden, wenn man es richtig macht :-)


Wenn du dich an das Webserver Tutorial gehalten hast, das ich auf die 
schnelle gefunden habe
1
void loop()
2
{
3
    EthernetClient client = server.available();  // try to get client
4

5
    if (client) {  // got client?
6
        boolean currentLineIsBlank = true;
7
        while (client.connected()) {
8
            if (client.available()) {   // client data available to read
9
                char c = client.read(); // read 1 byte (character) from client
10
... 
11
           } // end if (client.available())
12
        } // end while (client.connected())
13
        delay(1);      // give the web browser time to receive the data
14
        client.stop(); // close the connection
15
    } // end if (client)
16
}

... ja dann wundert mich das nicht mehr, dass du da in Zeitprobleme 
kommst. Das ist genau so programmiert, dass man eben nicht den µC 
mehrere Dinge quasi gleichzeitig erledigen lassen kann.
#3393914
Alexander Schmidt schrieb:
> Karl Heinz schrieb:
>> void loop()
>> {
>>     ...
>>         delay(1);      // give the web browser time to receive the data
>>     ...
>> }
> Man hat das Gefühl, Arduinos verführen zu schlechtem Code. Danke für das
> Beispiel, Karl-Heinz.

Der Delay ist an dieser Stelle gar nicht mal so sehr das Problem. 
delay(1) ist laut Arduino Doku 1 Millisekunde. Das wäre noch 
verschmerzbar.

Aber dieser Code will die komplette Transaktion vom Anmelden des 
Web-Browsers, bis zur Vollständigen Behandlung der kompletten Abfrage in 
einem Rutsch durchziehen.
Wobei: wenn ich mich nicht täusche dann melden sich doch Web-Browser gar 
nicht beim Server ab. Oder? D.h. das hier
1
    while (client.connected()) {
ist doch im Grunde nichts anderes als eine versteckte Abfrage auf "Hat 
sich der Browser lange genug nicht gemeldet, so dass man das als Timeout 
werten könnte". Kann auch sein, dass ich da daneben liege. So intim bin 
ich dann mit den Details da auch wieder nicht. Aber selbst wenn, sind 
das immer noch ein paar Pakete, die auf den Leitungen hin und her gehen 
müssen.
Gast #3394385
Karl Heinz schrieb:
> Wenn du dich an das Webserver Tutorial gehalten hast, das ich auf die
> schnelle gefunden
>
> ... ja dann wundert mich das nicht mehr, dass du da in Zeitprobleme
> kommst. Das ist genau so programmiert, dass man eben nicht den µC
> mehrere Dinge quasi gleichzeitig erledigen lassen kann.

Ja henauso hab ich das proggrammiert. Wie könnte man dies besser lösen?
#3396216
Stefan schrieb:
> Ja henauso hab ich das proggrammiert. Wie könnte man dies besser lösen?

Wenn Du möchtest, dass das Programm sowohl mit verbundenem Web-Client 
als auch mit nicht verbundenem Web-Client unmittelbar auf Tastendrücke 
reagiert, dann mußt Du eine Funktion zum Behandeln von Tastendrücken 
sowohl innerhalb Deiner längerlaufenden while-Schleife aufrufen als auch 
normal in der loop. Mal angenommen, die Funktion zum Behandeln von 
gedrückten Tasten nennst Du "handleInput()", dann beispielsweise:
1
void loop()
2
{
3
    EthernetClient client = server.available();  // try to get client
4

5
    if (client) {  // got client?
6
        boolean currentLineIsBlank = true;
7
        while (client.connected()) {
8
            handleInput();
9
            if (client.available()) {   // client data available to read
10
                char c = client.read(); // read 1 byte (character) from client
11
... 
12
           } // end if (client.available())
13
        } // end while (client.connected())
14
        delay(1);      // give the web browser time to receive the data
15
        client.stop(); // close the connection
16
    } // end if (client)
17
    handleInput();
18
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.