通过 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();
}
希望这对您的项目有所帮助。 :-)
我正在为客户完成一个项目。基本上它是一个交互式菜单,他可以在其中以更简单的方式为蓝牙模块发送 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();
}
希望这对您的项目有所帮助。 :-)