首页 文章

使用带有Microsoft SQL服务器的client.readStringUntil()ESP8266不需要的延迟

提问于
浏览
0

我的目标是在一段时间(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模块吗?

谢谢,-Danny-

1 回答

  • 0

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

    readStringUntil()是一个阻塞函数 . 我会等到它看到一个字符(在你的情况下为'\ r')或超时超过 .

    只需要将client.setTimeout添加为:

    WifiClient client;
    client.setTimeout(10);
    

    仍然不确定是否推荐这种做法,以及我应该更小的超时时间?

相关问题