2016-09-27 107 views
-1

我正在使用Arduino核心的ESP8266库,并且我写了几行将Esp8266变成运行http服务器的接入点,该服务器从传入的TCP客户端获取请求。然后请求通过串行发送到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); 
} 

如果我把一个HTTP响应只是它使用client.print("foo_bar_answer")后,它解决了问题,但我不希望发送答案但由于我必须首先解析请求,请通过串行将其发送到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 loop函数完全按照名称的含义:循环。这意味着这个函数将会永远持续地被Arduino框架调用(不止是你说的“5或6倍”)。

Arduino程序中的所有内容只应在草图启动时执行一次,应该写入setuploop是工人的功能,将被重复执行,直到你关掉电源。

所以,你应该loop检索请求,直到它收到来自那里的响应或超时把它送上别处,,然后发送答案回来。只有这样你才能离开loop,从而从头开始。

+0

感谢您的回答,但@gre_gor解决了我的问题 – Zbam