#include #include #include #include #include "circular_buf.h" #include "uart.h" struct circular_buffer uartRxBuffer; struct circular_buffer uartTxBuffer; // #define HI(x) ((x)>>8) // #define LO(x) ((x)& 0xFF) // #define BAUDRATE 9600L // скорость передачи по UART // #define BAUDRATE_REG (F_CPU/(16*BAUDRATE)-1) void UART_init(void) { UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1< length) { overflow = 1; } //clear_buffer(&uartRxBuffer); return overflow ? -1 : byteCount; // Возвращает количество успешно принятых байт или -1 в случае переполнения } // прерывание по завершению приема ISR(USART_RX_vect) { uint8_t data = UDR0; // читаем из регистра UDR0 if (!buffer_full(&uartRxBuffer)) { write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема } } ISR(USART_TX_vect) { if (!buffer_empty(&uartTxBuffer)) { UDR0 = read_buffer(&uartTxBuffer); } else { UCSR0B &= ~(1 << TXCIE0); // отключаем прерывание, когда все данные отправлены } }