From 458b145297e5cec1e133969a6995d4aca7fab6e8 Mon Sep 17 00:00:00 2001 From: Kirill Kurshakow Date: Mon, 12 Feb 2024 21:46:21 +0300 Subject: [PATCH] uart sending method fixed and interruption added --- UART/uart.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/UART/uart.c b/UART/uart.c index f16f362..714675f 100644 --- a/UART/uart.c +++ b/UART/uart.c @@ -6,6 +6,7 @@ #include "uart.h" struct circular_buffer uartRxBuffer; +struct circular_buffer uartTxBuffer; void UART_init(void) { UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи @@ -15,13 +16,13 @@ void UART_init(void) { } void UART_send(uint8_t* data, size_t length) { - for (size_t i = 0; i < length; i++) { - while (!(UCSR0A & (1 << UDRE0))) { - // Ждем опустошения буфера передачи - } - // Записываем в регистр UDR0 - UDR0 = data[i]; - } + for (size_t i = 0; i < length; i++) { + if (!buffer_full(&usartTxBuffer)) { + write_buffer(&usartTxBuffer, data[i]); + } else { + break; // если буфер передачи заполнен, то отправка прерывается + } + } } // Получение данных из буфера @@ -49,3 +50,9 @@ ISR(USART_RX_vect) { write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема } } + +ISR(USART_TX_vect) { + if (!buffer_empty(&uartTxBuffer)) { + UDR0 = read_buffer(&uartTxBuffer); + } +} \ No newline at end of file