首先,我正在使用NodeMCU进行RFID卡验证的迷你项目。我设置了一个数据库和一个服务器来处理来自客户端的所有请求。问题是,每当我尝试验证有效卡时,处理它的函数都会返回错误的值。
要清楚,这是我的主循环:
void loop() {
connectToHost();
key = kpd.getKey();
card = readCard();
delay(200);
//check for card status
if(verifyCard(card)){
Serial.println("Card is valid");
} else {
Serial.println("Invalid Card");
}
//check connection status
if(WiFi.status() == WL_CONNECTION_LOST){
connectToWiFi();
}
}
主循环调用此函数:
boolean verifyCard(String uid){
String url = "/ECafe/terminal_verify.php?uid=";
url += uid;
// This will send the request to the server
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
}
yield();
}
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
String line = client.readStringUntil('\r');
//if string contains echo from php file
if(line.indexOf("Valid")>0){
return true;
} else {
return false;
}
yield();
}
Serial.println();
Serial.println("Closing connection");
}
我故意在数据库中放入一个有效的卡片UID来测试这个功能。然而,它不断返回虚假。我确定服务器的响应是"有效"。我怀疑该函数甚至不等待来自服务器的响应并返回false值,因为发送GET请求之间的间隔并且返回的响应太短。这是因为主循环中的if条件?请参阅串行监视器输出的附件。
答案 0 :(得分:0)
你的功能逻辑是有缺陷的。
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
String line = client.readStringUntil('\r');
//if string contains echo from php file
if(line.indexOf("Valid")>0){
return true;
} else {
return false;
当代码读取第一行并且它不包含Valid
时,它将失败并返回false
。因此,您的代码将始终返回false,因为我怀疑返回的第一行是Valid
...
}
yield();
}
Serial.println();
Serial.println("Closing connection");
此代码的其余部分永远不会执行。 "关闭连接"永远不会打印出来吗?