【问题标题】:How to stop void loop in arduino?如何在arduino中停止无效循环?
【发布时间】:2019-04-08 04:14:13
【问题描述】:

我试图让 arduino 代码中的 void 循环只运行一次。这个算法或命令是什么? 我的代码是:

#include <String.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
SoftwareSerial s(D6,D5); // (Rx, Tx)
String saavi="ABCD";
String saavi1="123456789";
String shab;
String arr[4];
int a=0;
String arr1[10];
const char* shab1="";
const char* shab3="";
String shab2;
std::string str;
int i,j,k,x;
bool check=true;
void setup() {
 s.begin(9600);
 Serial.begin(9600);
 Serial.print("enter ssid: ");
}
void loop() {
    s.write("s");
    while(s.available() >0) {
    char data=s.read();
    shab += data;
    Serial.print(data);
   }
    if(shab.length()==4) {
    for(i=0;i<shab.length();i++)
    {
      arr[i]=shab.substring(i);
    }
     shab1 = arr[0].c_str();
     //Serial.println(shab1);
      if(arr[0] == saavi)
    { Serial.println();
      Serial.println("correct ssid");
      Serial.println("Enter ur password");
      delay(2000);
      s.write("s");
    while(s.available() >0) {
    char data1=s.read();
    shab2 += data1;
    Serial.print(data1);
    if(shab2.length()==9) {
    for(k=0;k<shab2.length();k++)
    {
      arr1[k]=shab2.substring(k);
    }
    shab3 = arr1[0].c_str();
    //Serial.println(shab3);
    if(arr1[0] == saavi1)
    {
      Serial.println();
    Serial.println("correct password");
    delay(3000);
    Serial.println("Connecting to wifi: ");
    delay(2000);
    Serial.println(shab1);
    Serial.flush();
    WiFi.begin(shab1,shab3);
     while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
    Serial.println(" IP address: ");
    Serial.print(WiFi.localIP());
    delay(2000);
    break;
    }
    else
    {
    Serial.print("wrong password");
    }
    } 
    }
    }else {
      Serial.print("Wrong ssid");
     }  
 }

}

当我运行此代码时,它一次又一次地显示“正确的 ssid 并输入您的密码”。这只是不停。那么,如何让 void 循环在这段代码中只运行一次。谁能帮帮我?

还有一个疑问。 在无效循环行号中。 18,我添加了 2000 毫秒的延迟,因为在不添加延迟的情况下,代码中的下一行即“while(s.available() >0)”不起作用。这个while命令非常快,需要一些延迟才能输入密码“123456789”。我应该怎么做才能让这个while循环在我按下键盘上的一个键之前不会这么快?请帮忙!!

【问题讨论】:

  • 在 mainloop 的末尾放置一个无限循环 (while(1);。顺便说一句。如果没有正确的缩进,您的代码很难阅读。
  • 这个命令 (while(1); 给出一个错误。
  • 如果你希望你的代码被调用一次,创建它的一个函数并在setup()函数中调用它。并添加无尽的while:syntex是while(1){}

标签: arduino


【解决方案1】:

在主循环的末尾放一个无限循环

    ....
    }else {
        Serial.print("Wrong ssid");
    } 
    while(1)                     //endless loop
    {
    }
}

【讨论】:

  • 为什么在while循环中有延迟?
  • 非常感谢@Mike
  • 我还有一个疑问,您能否提供帮助?
  • 在无效循环行号中。 18,我添加了 2000 毫秒的延迟,因为在不添加延迟的情况下,代码中的下一行即“while(s.available() >0)”不起作用。这个while命令非常快,需要一些延迟,以便我可以输入密码“123456789”。在我按下键盘上的一个键之前,我应该怎么做才能让这个 while 循环运行得这么快?
  • 我猜这是一个新问题。
【解决方案2】:

如果您只想在 Arduino 中执行一次代码。

  • 创建一个单独的函数来连接设备和 WiFi。
  • 从设置方法调用该函数。像这样,您的函数不会重复调用。
#include <ESP8266WiFi.h>

void setup()
{
  Serial.begin(115200);
  Serial.println();

  // For first time connection with WiFi
  ConnectWiFi();  
}


void ConnectWiFi()
{
  WiFi.begin("network-name", "pass-to-network");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());

}
void loop() {

 // if wifi disable inbetween and need to connect again
 if(WiFi.status() != WL_CONNECTED)
 {
 ConnectWiFi();
 }
}

【讨论】:

  • 如果状态为已连接,为什么还要连接wifi?我认为你在这里错过了一个否定
  • 感谢您的反馈,我已经更新了代码块
猜你喜欢
  • 2014-05-30
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多