我的目标是在一段时间(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 回答
[已解决]:我需要为readStringUntil()函数设置Timeout参数 .
只需要将client.setTimeout添加为:
仍然不确定是否推荐这种做法,以及我应该更小的超时时间?