Arduino: Comunicação por porta serial
📁 Estrutura de arquivos
UART_Voice/
├── UART_Voice.ino # Programa principal
├── bsp_uart.hpp # Arquivo de cabeçalho (quadros de protocolo e declarações de funções)
├── bsp_uart.cpp # Arquivo de implementação
└── README.md # Este tutorial🔌 Conexão de hardware
Conectar ao módulo de voz
💡 Atenção: RX e TX precisam ser conectados em cruzamento!

🔧 Compilação e upload
Primeiro passo: abrir o Arduino IDE
Abra o arquivo
UART_Voice.inoSelecione o modelo da sua placa de desenvolvimento (como o Arduino Uno)
Selecione a porta serial correspondente
Segundo passo: compilar e enviar
Clique no botão ✔️ para compilar
Clique no botão ➡️ para enviar à placa de desenvolvimento
📡 Teste da porta serial
Abrir o monitor serial no Arduino IDE
Taxa de transmissão: 115200
Caractere de fim de linha: Nenhum
Saída esperada
Após energizar, você deve ver:
UART Voice Module InitializedDiga a palavra de ativação e a palavra de comando ao módulo e o ID correspondente será exibido:
ID: 1
ID: 2
ID: 10📚 Formato do quadro do protocolo
Exemplo: ID de comando lido = 10
FE EF 00 0A EEExemplo: enviar reprodução de palavra de comando
FE EF D3 00 EE📚 Descrição da interface BSP
UART_Init()
void UART_Init(void);Função: inicializa a porta serial (taxa de transmissão 115200)
Exemplo:
void setup() {
UART_Init();
}UART_ReadCommand()
int UART_ReadCommand(void);
Função: lê o ID do comando reconhecido pelo módulo de voz
Valor de retorno:
0- nenhum comando reconhecido1~254- ID do comando-1- nenhum novo dado
Exemplo:
int id = UART_ReadCommand();
if (id > 0) {
Serial.print("识别到命令: ");
Serial.println(id);
}UART_SetPassiveVoice()
void UART_SetPassiveVoice(uint8_t voiceID);Função: define a voz de reprodução passiva
Parâmetros:
0x00- tipo de frase de reprodução passiva
Exemplo:
UART_SetPassiveVoice(0x00);
delay(200);UART_SetFunctionVoice()
void UART_SetFunctionVoice(uint8_t voiceID);Função: define a voz de reprodução das palavras de função
Parâmetros:
0x00- tipo de frase de reprodução de palavras de função
Exemplo:
UART_SetFunctionVoice(0x00);
delay(200);UART_SetCommandVoice()
void UART_SetCommandVoice(uint8_t voiceID);Função: define a voz de reprodução das palavras de comando
Parâmetros:
0x00- tipo de frase de reprodução de palavras de comando
Exemplo:
UART_SetCommandVoice(0x00);
delay(200);🎯 Descrição da lógica do programa principal
void setup() {
Serial.begin(115200);
UART_Init();
Serial.println("UART Voice Module Initialized");
UART_SetCommandVoice(0x00); // Ao energizar, reproduzir a voz das palavras de comando
delay(200);
}
void loop() {
int commandId = UART_ReadCommand();
if (commandId >= 0) {
// Filtrar valores inválidos para evitar saída duplicada
if (commandId != 0 && commandId != 255 && commandId != lastCommandId) {
Serial.print("ID: ");
Serial.println(commandId);
lastCommandId = commandId;
// Exemplo: controlar a reprodução conforme o comando reconhecido
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Comando 1 reconhecido; reproduzir a voz das palavras de comando
} else if (commandId == 2) {
UART_SetCommandVoice(0x00); // Comando 2 reconhecido; reproduzir a voz das palavras de comando
}
} else if (commandId == 0 || commandId == 255) {
if (lastCommandId != 0) {
lastCommandId = 0; // Redefinir o estado
}
}
}
delay(50);
}🔍 Solução de problemas
Q1: Nenhuma saída
Possíveis causas:
RX/TX invertidos
GND não aterrado em comum
Módulo sem alimentação
Taxa de transmissão incorreta
Solução:
Confirme que D10 está conectado ao TX do módulo e D11 ao RX do módulo (conexão cruzada)
Confirme a conexão do GND
Confirme se a alimentação de 5V está normal
Confirme se a taxa de transmissão da porta serial é 115200
Q2: A porta serial mostra apenas caracteres ilegíveis
Possíveis causas:
Taxa de transmissão incompatível
Energização anormal do módulo
Solução:
Confirme se a taxa de transmissão do monitor serial é 115200
Pressione o botão de reset do módulo
Q3: Saída de "ID: 255" ou "ID: 0"
Observação: isso é normal
0= nenhum comando reconhecido255= nenhum novo dado
Esses valores já são filtrados no código, por isso normalmente não são exibidos. Se você vir essa saída, significa que o código não está em vigor.
💡 Vantagens da arquitetura BSP
Camadas de código bem definidas
bsp_uart.hpp - contém apenas as declarações, não a implementação
bsp_uart.cpp - detalhes concretos da implementação
UART_Voice.ino - trata apenas da lógica de negócio
Fácil de portar
Se você trocar para outra plataforma (como STM32 ou ESP32), basta modificar a implementação de bsp_uart.cpp; o programa principal não precisa ser alterado.
Fácil de manter
As alterações no código relacionado ao UART ficam apenas em bsp_uart.cpp; uma única alteração vale em todos os lugares.
🚀 Exemplos de funções estendidas
Exemplo 1: acionar diferentes reproduções conforme o comando
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Reproduzir palavras de comando
} else if (commandId == 2) {
UART_SetFunctionVoice(0x00); // Reproduzir palavras de função
} else if (commandId == 3) {
UART_SetPassiveVoice(0x00); // Reproduzir voz passiva
}Exemplo 2: controlar o LED
if (commandId == 10) {
digitalWrite(LED_PIN, LOW); // Apagar a luz
UART_SetCommandVoice(0x00); // Reproduzir confirmação
}Exemplo 3: controlar o motor
if (commandId == 11) {
motor_stop();
UART_SetCommandVoice(0x00); // Reproduzir confirmação
}
