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