/*
Elabore um código utilizando a interfaces UART0 e conecte os fios TX e
RX atribuídos à essa interface entre. Essa estrutura envia dados e
recebe os dados na mesma interface, apenas para verificar seu funcionamento.
Utilize a função scanf da biblioteca stdio para enviar via console um
dado à placa, em seguida, transmita da UART0 para a UART1, e por fim,
transmita o dado recebido para o console utilizando o printf. */
#include <stdio.h>
#include "pico/stdlib.h"
#include <string.h>
#include "hardware/uart.h"
// Definição dos pinos TX e RX para UART0 e UART1
#define UART0_TX_PIN 0 // UART0 TX
#define UART0_RX_PIN 1 // UART0 RX
#define UART1_TX_PIN 8 // UART1 TX
#define UART1_RX_PIN 9 // UART1 RX
#define BAUD_RATE 9600
#define BUF_SIZE 256
// Configura as UARTs
void config_uart() {
uart_init(uart0, BAUD_RATE);
gpio_set_function(UART0_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART0_RX_PIN, GPIO_FUNC_UART);
uart_init(uart1, BAUD_RATE);
gpio_set_function(UART1_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART1_RX_PIN, GPIO_FUNC_UART);
uart_set_fifo_enabled(uart0, true);
uart_set_fifo_enabled(uart1, true);
}
// Função para limpar o buffer da UART
void clear_uart(uart_inst_t *uart) {
while (uart_is_readable(uart)) {
uart_getc(uart); // Descarta qualquer dado pendente
}
}
// Envia dados pela UART
void send_uart(uart_inst_t *uart, const char* data) {
while (*data) {
uart_putc(uart, *data++);
sleep_us(100); // Pequeno delay para garantir estabilidade
}
}
// Recebe dados da UART
void receive_uart(uart_inst_t *uart, char* buffer, int max_length) {
int i = 0;
while (i < max_length - 1) {
if (uart_is_readable_within_us(uart, 50000)) { // Aguarda até 50ms
buffer[i++] = uart_getc(uart);
} else {
break; // Sai do loop se não há mais dados
}
}
buffer[i] = '\0'; // Adiciona terminador nulo
}
int main() {
stdio_init_all();
config_uart();
char input[BUF_SIZE];
char received[BUF_SIZE];
while (true) {
printf("\nDigite uma mensagem (ou 'E' para sair): ");
fflush(stdout); // Garante que a mensagem apareça antes da entrada
if (scanf(" %[^\n]", input) == 1) {
if (strcmp(input, "q") == 0) {
break;
}
// Limpa a UART1 antes de receber novos dados
clear_uart(uart1);
// Envia dados pela UART0 para UART1
send_uart(uart0, input);
// Aguarda e recebe na UART1
receive_uart(uart1, received, BUF_SIZE);
printf("\nRecebido via UART1: %s\n", received);
}
sleep_ms(100);
}
return 0;
}