From 5c4e2be040adc2b1ab081be1011043e9fa4b1537 Mon Sep 17 00:00:00 2001 From: Kirill Kurshakow Date: Sun, 11 Feb 2024 21:19:28 +0300 Subject: [PATCH] modified uart receive method and some refactoring --- UART/timer.c | 21 ------------------ UART/timer.h | 7 ------ UART/uart.c | 63 +++++++++++++++++++++------------------------------- UART/uart.h | 5 ----- 4 files changed, 25 insertions(+), 71 deletions(-) delete mode 100644 UART/timer.c delete mode 100644 UART/timer.h diff --git a/UART/timer.c b/UART/timer.c deleted file mode 100644 index ca35795..0000000 --- a/UART/timer.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -static volatile unsigned long timerMillis = 0; - -void timerInit() { - TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); - OCR1A = 250; - TIMSK1 |= (1 << OCIE1A); - sei(); -} - -unsigned long millis() { - unsigned long ms; - ms = timerMillis; - return ms; -} - -ISR(TIMER1_COMPA_vect) { - timerMillis++; -} \ No newline at end of file diff --git a/UART/timer.h b/UART/timer.h deleted file mode 100644 index f5b07fe..0000000 --- a/UART/timer.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -void timerInit(); -unsigned long millis(); - -#endif // TIMER_H \ No newline at end of file diff --git a/UART/uart.c b/UART/uart.c index 355d7ee..f16f362 100644 --- a/UART/uart.c +++ b/UART/uart.c @@ -2,10 +2,11 @@ #include #include #include -#include "timer.h" #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); @@ -14,51 +15,37 @@ void UART_init(void) { } void UART_send(uint8_t* data, size_t length) { - for (size_t i = 0; i < length; i++) { - if (!buffer_full(&usartTxBuffer)) { - write_buffer(&usartTxBuffer, data[i]); - } else { - break; // если буфер передачи заполнен, то отправка прерывается - } - } - UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера + 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; // Счетчик байтов, принятых из буфера приема - uint32_t timeout_ms = 4; // Таймаут в миллисекундах для общего времени приема данных - uint32_t start_time = millis(); - //Цикл приема данных с таймаутом - while(1) - { - // Пока буфер приема не пуст и не истек таймаут общего времени, - // функция продолжает читать байты из буфера и сохранять их в массив data. - while (!buffer_empty(&usartRxBuffer)) { - int reader = read_buffer(&usartRxBuffer);//прием и запись символа в переменную - if(byteCount<=length){ - data[byteCount] = reader; // запись в массив с индексом byteCount - } - else{ - overflow=1; - } - byteCount++; - - start_time = millis(); - } - if ((millis() - start_time) > timeout_ms) { // если превышение времени в 4 ms - break; - } - - } - return overflow?-1:byteCount; // возвращает количество успешно принятых байт или -1 + 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(&usartRxBuffer)) { - write_buffer(&usartRxBuffer, data);// записываем символ в буфер приема + if (!buffer_full(&uartRxBuffer)) { + write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема } } diff --git a/UART/uart.h b/UART/uart.h index e9fa4eb..99fd06c 100644 --- a/UART/uart.h +++ b/UART/uart.h @@ -2,14 +2,9 @@ #define UART_H #include #include -#include "timer.h" -#include "circular_buf.h" #define F_CPU 16000000 -struct circular_buffer usartRxBuffer; -struct circular_buffer usartTxBuffer; - void UART_init(void); void UART_send(uint8_t* data, size_t length); int UART_receive(uint8_t* data, size_t length);