我的目标是读取在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模块吗?
谢谢你, -丹尼-
答案 0 :(得分:0)
[已解决]:我需要为readStringUntil()函数设置Timeout参数。
readStringUntil()是一个阻止函数。我将等到看到一个字符(在您的情况下为'\ r')或超过超时时间。
只需将client.setTimeout添加为:
WifiClient client;
client.setTimeout(10);
仍然不确定是否推荐这种做法,我应该将超时时间减小多少?
答案 1 :(得分:0)
另一种解决方案是使用freeRTOS,并将Web服务器置于单独的任务中。 然后它可以永远等待,直到有请求传入。