使用client.readStringUntil()ESP8266不必要的延迟,Microsoft SQL服务器



我的目标是读取一段时间(30秒(内的按钮按下次数,使用php脚本将其上传到Microsoft SQl表。在表格上,还有另一列,它添加了按压的累积总和,这些总和将由 php 脚本回显,并由ESP8266板读取。

所以一切都通过:我可以读取计数,上传它,读回累积的总和。问题是它总是需要 ~5s 才能从服务器获取值。附上我的疑难解答:串行窗口

连接到服务器几乎需要立即(~100ms(,但读取回显数据需要5秒。

我的猜测是 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模块?

谢谢 -丹尼-

[SOLVED]:我需要为 readStringUntil(( 函数设置 Timeout 参数。

readStringUntil(( 是一个阻塞函数。我会等到它看到一个字符(在你的例子中是'\r'(或超时超过。

只需要将client.setTimeout添加为:

WifiClient client;
client.setTimeout(10);

仍然不确定是否建议这种做法,以及我应该去多小的超时?

另一种解决方案是使用 freeRTOS,并将 Web 服务器放在一个单独的任务中。 然后它可以永远等待,直到请求进来。

最新更新