【问题标题】:Function doesn't return the right value函数没有返回正确的值
【发布时间】:2018-03-11 04:53:35
【问题描述】:

首先,我正在做一个关于使用 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 只是为了测试这个功能。然而,它一直返回错误。我确定来自服务器的响应是“有效的”。我怀疑该函数甚至不等待来自服务器的响应并返回一个错误值,因为发送 GET 请求和返回响应之间的间隔太短。那是因为主循环中的 if 条件吗?串行监视器输出见附件。

【问题讨论】:

  • 从 while(client.available()) 循环中取出 if 条件似乎可以解决问题。但有时我会遇到客户端超时循环和 hv 重置模块以修复它。
  • 函数结束时收到“正在关闭连接”消息应该返回什么?没有返回语句。
  • 该消息什么也不做。我应该在发布之前将其删除。
  • 如果在这个执行路径中不调用return语句,会返回一些随机值
  • 另问:forum.arduino.cc/index.php?topic=534412 如果您打算这样做,请考虑周到添加指向您交叉发布的其他地方的链接。这将使我们避免因重复工作而浪费时间,并帮助有相同问题并找到您的帖子的其他人发现所有相关信息。

标签: arduino iot verification rfid nodemcu


【解决方案1】:

你的函数逻辑有缺陷。

  // 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");

此代码的其余部分永远不会执行。 “关闭连接”永远不会打印对吗?

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多