2016-09-27 4 views
-1

私はESP8266ライブラリにArduinoコアを使用していますが、入ってくるTCPクライアントからの要求を取得するHTTPサーバを実行するアクセスポイントにEsp8266を送ります。リクエストはシリアル経由でRaspberry Piに送られます。readStringUntilがEsp8266のArduinoスケッチで何度も起動されました

Serial.println(req)行が5回または6回実行される以外はすべて問題ありません。ここで奇妙な行動を再現、私のコードの機能縮小版である:

#include <ESP8266WiFi.h> 

WiFiServer server(80); 

void setup() { 
    Serial.begin(115200); 
    WiFi.softAP("zouzou3000", "totocaca"); 
    server.begin(); 
} 

void loop() { 
    WiFiClient client = server.available(); 
    if (!client) { 
     return; 
    } 

    String req = client.readStringUntil('\r'); 
    Serial.println(req); 

    delay(1); 
} 

私はちょうどそれがclient.print("foo_bar_answer")を使用した後、HTTPレスポンスを置く場合、それは問題を解決するが、私は答えを送信しませんそれでも私はリクエストを最初に解析しなければならないので、シリアル経由でRBPIに送信し、答えを待ってからクライアントに送り返します。私はこの動作を防ぐために遅延を増やしたり、ブール値を使用しようとしましたが、動作しません。私はArduinoプログラミングのかなりの騒ぎです。どんな助けも歓迎です!

+0

HTTPリクエストを解析する方法がわからない場合は、[HTTPサーバーライブラリ](https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer)を使用してください。 –

+0

一般的なHTTPリクエストにはいくつかの\ rがあります。ここから、複数のプリントがおそらく次のループの繰り返しから来ているでしょう。 – leetibbett

+0

@gre_gorご助言ありがとうございます。 HelloServerの例をAPモードで動作させるために、HTTPリクエストを正しく解析することができました。 – Zbam

答えて

0

関数は、名前が意味するものとまったく同じです:ループします。これは、この関数がArduinoフレームワークによって永遠に終わりまで継続的に呼び出されることを意味します(あなたが言うように "5,6回"だけでなく)。

スケッチの起動時に一度だけ行う必要があるArduinoプログラムのすべてはsetupになります。 loopは、電源を切るまで繰り返し実行されるワーカー関数です。

だからあなたloop、要求を取得し、それはそこからの応答またはタイムアウトを受信するまでブロック、どこか別の場所にそれをオフに送信し、その後戻って答えを送信する必要があります。そのときだけ、loopから出発して、最初からやり直すことができます。

+0

あなたの答えをありがとうが、@ gre_gor私の問題を解決した – Zbam

関連する問題