#include #include #include #include #include "circular_buf.h" #include "uart.h" struct circular_buffer uartRxBuffer; void UART_init(void) { UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // прерывание по приему и опустошению буфера передачи UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UBRR0H = 0; UBRR0L = 103; } 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]; } } // Получение данных из буфера int UART_receive(uint8_t* data, size_t length) { char overflow = 0; // Флаг переполнения, который устанавливается, если превышен размер массива uint32_t byteCount = 0; // Счетчик байтов, принятых из буфера приема // Пока буфер приема не пуст и не превышен лимит длины массива, // функция продолжает читать байты из буфера и сохранять их в массив data. while (!buffer_empty(&uartRxBuffer) && byteCount < length) { int reader = read_buffer(&uartRxBuffer); // Прием и запись символа в переменную data[byteCount] = reader; // Запись в массив с индексом byteCount byteCount++; } // Проверка переполнения if (byteCount > length) { overflow = 1; } return overflow ? -1 : byteCount; // Возвращает количество успешно принятых байт или -1 в случае переполнения } // прерывание по завершению приема ISR(USART_RX_vect) { uint8_t data = UDR0; // читаем из регистра UDR0 if (!buffer_full(&uartRxBuffer)) { write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема } }