#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/uart.h"
// Definição dos pinos - Evitando conflito com Console
#define UART0_TX_PIN 0 // Para Console
#define UART0_RX_PIN 1
#define UART1_TX_PIN 4 // Para Loopback
#define UART1_RX_PIN 5
void config_uart() {
// Configura UART0 (para Console)
uart_init(uart0, 9600);
gpio_set_function(UART0_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART0_RX_PIN, GPIO_FUNC_UART);
uart_set_format(uart0, 8, 1, UART_PARITY_NONE);
// Configura UART1 (para Testes)
uart_init(uart1, 9600);
gpio_set_function(UART1_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART1_RX_PIN, GPIO_FUNC_UART);
uart_set_format(uart1, 8, 1, UART_PARITY_NONE);
}
// Função para limpar buffer da UART completamente
void clean_buffer_uart(uart_inst_t *uart) {
while (uart_is_readable(uart)) {
uart_getc(uart); // Lê e descarta qualquer dado antigo.
// Ideal para cls no buffer
}
sleep_ms(50);
}
int main() {
// Para saídas
stdio_init_all();
// Configura UART´S
config_uart();
// Limpeza completa antes de começar
fflush(stdout);
clean_buffer_uart(uart0);
clean_buffer_uart(uart1);
printf("Sistema inicializado! \n");
while (true) {
// Simula um "loopback", onde o dado enviado pela UART0 é lido pela UART1
printf("---------------------");
printf("\nDigite um caractere: ");
fflush(stdout);
char caractere;
// scanf para capturar a entrada do operador
scanf(" %c", &caractere);
printf("\nEnviando pela UART0: %c\n", caractere);
fflush(stdout);
// Aguarda antes de enviar para garantir buffers limpos
sleep_ms(50);
clean_buffer_uart(uart0);
clean_buffer_uart(uart1);
// Envia o caractere pela UART0 somente se estiver pronto
if (uart_is_writable(uart0)) {
uart_putc(uart0, caractere);
caractere = '\0'; // Reset da variável
}
sleep_ms(200);
// Aguarda até que a UART1 receba um caractere válido
while (!uart_is_readable(uart1)) {
sleep_ms(10);
}
// Lê o caractere recebido e descarta ruídos
// Se o valor recebido estiver abaixo de 32 ou acima de 126,
// significa que o caractere não é um caractere imprimível
char recebido = uart_getc(uart1);
if (recebido < 32 || recebido > 126) {
printf(" caractere fora da faixa que pode ser impresso - (ASCII: %d)\n", recebido);
clean_buffer_uart(uart1);
continue;
}
printf(": foi recebido pela UART1 - (ASCII: %d)\n", recebido);
recebido = '\0'; // Reset da variável
fflush(stdout);
sleep_ms(500);
}
return 0;
}