通过 IF 语句调用函数时的问题

Issues when calling functions through IF Statement

我正在为客户完成一个项目。基本上它是一个交互式菜单,他可以在其中以更简单的方式为蓝牙模块发送 AT 命令。

代码在第一个函数 ("padrao") 上运行。它正确发送 AT 命令。 (另请忽略代码中遗漏的部分)

问题是: 唯一能够被 IF 语句调用的函数是 "padrao"。任何其他功能都不起作用。我可以改变什么来解决问题? 提前致谢!

尝试改用 SWITCH 和 CASE,但无法像这样调用任何函数...

(我只留下了一个剩余的功能来比较。如果你们中的任何人需要剩余的代码,请告诉我)


/* Menu interativo para comandos dos módulos Bluetooth HC-05, HC-06, HC-08, HM-10, etc.
 *  Nathan - 29/04/2019
 *  

#include <SoftwareSerial.h>
#define rx 3
#define tx 4

SoftwareSerial Seria1(rx, tx); // Declara os pinos utilizados para a comunicação serial
int entrada = 0 ;
int echo;

void setup () {
  Serial.begin(9600); // Inicia a comunicação serial a 9600 bauds
  Seria1.begin(9600); // Inicia a interface serial de software a 9600 bauds
  Serial.println("Interface de testes Bluetooth ver. 0.1");
  Serial.println("Escolha uma opção pelo terminal serial");
  Serial.println("1. Redefinir o módulo para as configurações de fábrica");
  Serial.println("2. Reset");
  Serial.println("3. Verificar o endereço do módulo");
  Serial.println("4. Verificar o nome do módulo [como será reconhecido]");
  Serial.println("5. Mudar o nome do módulo");

  //Teste da variável "entrada". Debug apenas.
  //Serial.println(entrada);

  pinMode (LED_BUILTIN, OUTPUT);
}

void loop () {
if (Serial.available()){
    entrada = Serial.parseInt();
    delay(100);

  if (entrada == 1) 
  { 
    echo == entrada;
    padrao();

    }
    if (entrada == 2) {
      Seria1.write("AT+RST");
      entrada = 0;
    }
    if (entrada == 3) {
      Seria1.write("AT+ADDR?");
      entrada = 0;
    if (entrada == 9) {

      nome();

      }
    if (entrada == 4) {
        char comando[] = "AT+NAME=";
        Serial.println ("Digite o nome do dispositivo desejado");
        while(!Serial.available() ){
        }
          int nome = Serial.read();
          Seria1.write (comando + nome);
          entrada = 0;
        }
      }
      if (entrada == 5) {
        Seria1.write ("AT+ROLE=0");
        entrada = 0;
        }
       if (entrada == 6) {
        Seria1.write ("AT+ROLE=1");
        entrada = 0;
      }
        if (entrada == 7) {
        Seria1.write ("AT+PSWD?");
        entrada = 0;
        }
        if (entrada == 8) {
        Seria1.write ("AT+STATE?");
        entrada = 0;
        }
    }
}

void padrao() {

    digitalWrite(LED_BUILTIN,LOW); 
    Serial.println("Deseja resetar o dispositivo para as configurações padrão?");
    Serial.println("Digite '1' para prosseguir");
    int resposta = Serial.parseInt();
    while (resposta != 1) {
      if (resposta == 1) {
        break;
      }
      }
    {
      delay(1000);
      Seria1.write("AT+ORGL");
      Serial.print("Comando enviado!");
      entrada = 0;
    }
}
void nome() {
        delay(100);
        Serial.write("O nome do dispositivo é:");
        Seria1.write("AT+NAME?");
        //debug
        Serial.print("teste");
        entrada = 0;
}

我认为你的问题出在这里:

    if (entrada == 3) {
      Seria1.write("AT+ADDR?");
      entrada = 0;
    if (entrada == 9) {

      nome();

      }
    if (entrada == 4) {

基本上,如果 entrada == 3,那么您进入这个块,您可能会在其中调用 nome()。

但是,如果entrada == 3,则不可能等于9。此外,您在测试它是否为 9 之前将 entrada 重置为 0。因此 entrada 不可能为 9,因此无法调用 nome。

可能您希望代码如下所示:

    if (entrada == 3) {
      Seria1.write("AT+ADDR?");
      entrada = 0;
    }                // The previous if statement was not ended.
    if (entrada == 9) {

      nome();

    }
    if (entrada == 4) {

您需要删除代码中更下方的右大括号。

另外,我注意到你有这个:

    if (entrada == 4) {
        char comando[] = "AT+NAME=";
        Serial.println ("Digite o nome do dispositivo desejado");
        while(!Serial.available() ){
        }
          int nome = Serial.read();             // See below
          Seria1.write (comando + nome);
          entrada = 0;
        }
      }

通常,为变量和其他目的(即 nome() 函数)使用相同的名称不是一个好主意。在这种情况下,它可能没问题,但稍后可能会造成混淆 - 特别是如果此代码块变大并且您需要从其中调用 nome() 函数。

最后,echo == 这行代码没有做任何事情。那是你想要的吗?

  if (entrada == 1) 
  { 
    echo == entrada;      // This is a non-operation. Did you mean for it to be something else?
    padrao();

    }

希望这对您的项目有所帮助。 :-)