Arduino命令超时

时间:2016-09-21 09:54:53

标签: arduino settimeout

我目前正在与Arduino合作填补我的一个DIY项目。

目前看来,我的指纹扫描仪(GT-511C3)连接到我的Arduino,效果很好。我能够验证登记的指纹。

通过Raspberry Pi命令(由按钮按下启动)验证finterprints的发生情况

逻辑上,这意味着,当按下按钮时,Raspberry Pi会发送一个'验证'对Arduino的命令,反过来要求指纹扫描程序运行验证命令。

但是,我希望在发送的validate命令后超时。超时需要确保如果按下按钮(并且启动了validate命令),但是没有人将他们的手指放在机器上,它会超时并恢复到等待validate命令的状态。

我无法完成此操作。这是我尝试过的代码:

#include "FPS_GT511C3.h"
#include "SoftwareSerial.h"

FPS_GT511C3 fps(4, 5);
int val = 0;

void setup()
{
  Serial.begin(9600);
  delay(100);
  fps.Open();
  fps.SetLED(false);
}

void loop(){

if (Serial.available() > 0) {
  Continue:
  if(Serial.find("validate")){
    fps.SetLED(true);
    do {
      ++val;
      delay(100);
    }
    while(fps.IsPressFinger() == false || val > 150);
    if(val <= 150){
      fps.SetLED(false);
      goto Continue;
    }
    if (fps.IsPressFinger()){
      fps.CaptureFinger(false);
      int id = fps.Identify1_N();
      if (id <200)
    {
        Serial.print("Verified ID:");
        Serial.println(id);
        fps.SetLED(false);

    }
    else
    {
          Serial.println("Finger not found");
          fps.SetLED(false);
    }
  }
  else
  {
            Serial.println("Please press finger");
  }
  delay(100);

    }   
  }
}

否则代码工作正常,如果放置并验证了手指,它会关闭并返回等待另一个验证命令。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先,摆脱标签和goto 。这里没有任何理由;它被认为是糟糕的编程习惯,除非您确切知道自己在做什么,否则不应该使用它。只有在汇编中才可以自由地使用goto(相当于JMP)。 接下来,您的while条件错误。如果你试图解释它,你会发现它没有任何意义:

Wait for as long as nobody has placed a finger or if the timeout has expired.

你可能想要的是:

Wait for as long as nobody has placed a finger and the timeout has not expired.

转换为:

while(fps.IsPressFinger() == false && val < 150);

随后的IF条件也是错误的,应该是:

if the timeout has expired

转换为:

if(val >= 150){
  fps.SetLED(false);
  val = 0;
  continue;
}

请注意使用重新启动循环的continue关键字。要使其合法化,请将if (Serial.available() > 0)更改为while (Serial.available() > 0)