uart sending method fixed and interruption added
This commit is contained in:
parent
5c4e2be040
commit
458b145297
21
UART/uart.c
21
UART/uart.c
@ -6,6 +6,7 @@
|
|||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
|
|
||||||
struct circular_buffer uartRxBuffer;
|
struct circular_buffer uartRxBuffer;
|
||||||
|
struct circular_buffer uartTxBuffer;
|
||||||
|
|
||||||
void UART_init(void) {
|
void UART_init(void) {
|
||||||
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи
|
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) {
|
void UART_send(uint8_t* data, size_t length) {
|
||||||
for (size_t i = 0; i < length; i++) {
|
for (size_t i = 0; i < length; i++) {
|
||||||
while (!(UCSR0A & (1 << UDRE0))) {
|
if (!buffer_full(&usartTxBuffer)) {
|
||||||
// Ждем опустошения буфера передачи
|
write_buffer(&usartTxBuffer, data[i]);
|
||||||
}
|
} else {
|
||||||
// Записываем в регистр UDR0
|
break; // если буфер передачи заполнен, то отправка прерывается
|
||||||
UDR0 = data[i];
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получение данных из буфера
|
// Получение данных из буфера
|
||||||
@ -49,3 +50,9 @@ ISR(USART_RX_vect) {
|
|||||||
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
|
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ISR(USART_TX_vect) {
|
||||||
|
if (!buffer_empty(&uartTxBuffer)) {
|
||||||
|
UDR0 = read_buffer(&uartTxBuffer);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user