FELIPE ULBRIK FELIN
21/02/2023 21:35:59
A váriável 'result' inicia com seu valor atribuído como 1. Em cada teste de condição if, não esta sendo atribuído um novo valor para a variável 'result'? A função 'bluetooth_write_command()' tem dois retornos -1 em caso de erro ou 0 caso sucesso. Caso a função 'bluetooth_write_command()' retorne 0 ( sucesso), realizando o AND com 'result' é zero, logo o valor zero seria atribuído a 'result', não validando a condição if e seguindo em frente no código. Caso a comunição com o módulo funcione tem uma linha de código 'return result' que como comentário especifica que deva retornar o valor 1 caso funcione corretamente. Minha dúvida é em cada teste da condição if na minha concepção o valor da variável 'result' estaria sendo modificada.
int8_t bluetooth_config( void ) { int8_t result = 1; bluetooth_mode( AT_MODE ); #if (BLUETOOTH_MODE == SLAVE_MODE) /** * Configura em modo AT; */ if((result=(result & bluetooth_write_command((int8_t*) "AT\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Define dispositivo como Slave; * Role -> 0 modo slave; * Role -> 1 modo master; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+ROLE=0\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Define o nome do dispositivo bluetooth; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+NAME="BLUETOOTH_SLAVE_NAME"\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Configura a senha PIN do bluetooth slave; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+PSWD="BLUETOOTH_PIN_CODE"\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Configura em modo de conexão. Dessa forma assim que o módulo for resetado ele irá iniciar * o envio das mensagens em busca de conexão; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+CMODE=1\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Configuração da serial, baudrate, stopbits, paridade; * A configuração do baudrate do bluetooth é a mesma da Uart; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+UART="BLUETOOTH_BAUDRATE",0,0\r\n ", (int8_t*) "OK", 1000 )))==1) return -1; /** * Após configuração é recomendado resetar o dispositivo; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+RESET\r\n", (int8_t*) "OK", 1000 )))==1) return -1; #elif (BLUETOOTH_MODE == MASTER_MODE) /** * Comando para teste da comunicação AT entre MCU e Bluetooth; */ if((result = (result & bluetooth_write_command((int8_t*) "AT\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Deleta da memória todo os possíveis slaves autenticados, ou seja, remove dispositivos anteriormente pareados; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+RMAAD\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Define o nome do dispositivo bluetooth; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+NAME="BLUETOOTH_MASTER_NAME"\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Define a senha de PIN; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+PSWD="BLUETOOTH_PIN_CODE"\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Define como bluetooth master; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+ROLE=1\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Parametro: 0 -> Conecta somente com um bluetooth endereçado/fixado; * Parametro: 1 -> Conecta com qualquer dispositivo bluetooth slave na aproximidade; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+CMODE=1\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Modo de varredura : padrão, procura por 5 dispositivos e finaliza a varredura após 10s; */ if((result = (result & bluetooth_write_command((int8_t*) "AT+INQM=0,5,10\r\n", (int8_t*) "OK", 1000 )))==1) return -1; /** * Configuração da serial, baudrate, stopbits, paridade; * A configuração do baudrate do bluetooth é a mesma da Uart; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+UART="BLUETOOTH_BAUDRATE",1,0\r\n ", (int8_t*) "OK", 1000 )))==1) return -1; /** * Após configuração é recomendado resetar o dispositivo; */ if((result=(result & bluetooth_write_command((int8_t*) "AT+RESET\r\n", (int8_t*) "OK", 1000 )))==1) return -1; #endif /** * Depois disso, se os dois módulos estiverem ligados, eles se conectarão e transferirão dados entre si de forma * transparente; */ bluetooth_mode( TRANSFER_MODE ); /** * Reseta a fifo para garantir que o buffer esteja vazio; */ bluetooth_clear_fifo(); /** * Caso result = 1 então o bluetooth foi configurado corretamente; */ return result; }
FERNANDO SIMPLICIO DE SOUSA
24/02/2023 15:13:57
Olá Felipe. Sim, é verdade. Acabei alterando a variável 'result' a cada execução dos comandos, o que não deveria ter feito. Segue uma pequena modificação no exemplo. Entretanto, vou avaliar melhor pois 'bluetooth_write_command' pode retornar -1, questão que complica o teste com o operador &;
/* //passo a passo... result = 1; if(((result & bluetooth_write_command((const char *) "AT\r\n", (const char *) "OK", 20 )))==1) return -1; if(((1 & 0))==1) return -1; if((0)==1) return -1; //consição falsa, logo continua executando a função... return result; */