ESP8266使用client.readStringUntil()和Microsoft SQL Server产生不必要的延迟

时间:2018-06-21 17:30:40

标签: sql-server esp8266 arduino-esp8266

我的目标是读取在30秒钟内按下按钮的次数,并使用php脚本将其上传到Microsoft SQl表。在桌子上,还有另一列增加了印刷机的累加总和,这些总和将由php脚本回显,并由ESP8266板读取。

所以一切都进行了:我可以读取计数,将其上传,再读取累积的总和。问题是,从服务器取回值总是要花大约5秒钟的时间。附件是我的疑难解答:Serial Windows

连接到服务器几乎要花费大约100ms的时间,而读取数据要花5s的时间。

我的猜测是php脚本需要花一些时间才能运行到回显值的行,但是即使我尝试了一个简单的脚本(仅回显),也会发生相同的延迟(〜5s)。

这是服务器的行为方式(不立即发出数据)还是Arduino代码(client.readStringUntil())的行为方式?

这是我的代码:

#include <SPI.h>
#include <ESP8266WiFi.h>

// Wifi Connection config
const char* ssid = "------";
const char* password = "------";

WiFiServer server(80);

IPAddress dbserver(10,1,1,138);  

void setup_wifi() 
{
  delay(10);
  // We start by connecting to a WiFi network
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

void setup()
{
  Serial.begin(115200);
  // Connect to WiFi network
  setup_wifi();
}

void loop ()
{
  WiFiClient client;
  const int httpPort = 80;
  bool conn = client.connect(dbserver,httpPort);
  if (!conn) {
    Serial.println("connection failed");
    return;
  }
  else {
    // call php script on the server(echo 1 value)
    client.print("GET /test10.php HTTP/1.1");    
    client.println("Host: 10.1.1.138");
    client.println("Connection: close");
    client.println(); // Empty line

    // Read from the server
    Serial.println(millis());       // millis start reading
    unsigned long timeout = millis();
    while (client.available()==0){
    if (millis()-timeout >1000){
      Serial.println(">>> Client Timeout !");
      client.stop();
    }
  }
  Serial.println(millis());         // millis get the data stream
  while (client.available()){
    String line = client.readStringUntil('\r');
    Serial.println(String(millis()) + " >>> "+line);  // millis get each  
                                                      // data line
  }
    delay(10);
    client.stop();    // Closing connection to server
    Serial.println("done");
  }
  delay(30000);
}

还有其他方法可以从服务器获取数据到ESP8266模块吗?

谢谢你, -丹尼-

2 个答案:

答案 0 :(得分:0)

[已解决]:我需要为readStringUntil()函数设置Timeout参数。

  

readStringUntil()是一个阻止函数。我将等到看到一个字符(在您的情况下为'\ r')或超过超时时间。

只需将client.setTimeout添加为:

WifiClient client;
client.setTimeout(10);

仍然不确定是否推荐这种做法,我应该将超时时间减小多少?

答案 1 :(得分:0)

另一种解决方案是使用freeRTOS,并将Web服务器置于单独的任务中。 然后它可以永远等待,直到有请求传入。