From 93c44a6f136da17942111407b11a27d4620f3808 Mon Sep 17 00:00:00 2001 From: Kirill Kurshakow Date: Wed, 17 Jan 2024 16:11:54 +0300 Subject: [PATCH] UART modified and added header file --- UART/{main.c => uart.c} | 32 +++++++++++++++++--------------- UART/uart.h | 12 ++++++++++++ 2 files changed, 29 insertions(+), 15 deletions(-) rename UART/{main.c => uart.c} (66%) create mode 100644 UART/uart.h diff --git a/UART/main.c b/UART/uart.c similarity index 66% rename from UART/main.c rename to UART/uart.c index 70784a5..a0ba34e 100644 --- a/UART/main.c +++ b/UART/uart.c @@ -28,7 +28,7 @@ void UART_send(uint8_t* data, size_t length) { UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера } -void USART_put_char(unsigned char sym) { +void UART_put_char(unsigned char sym) { if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) { UDR0 = sym; } else { @@ -40,38 +40,42 @@ void USART_put_char(unsigned char sym) { } } -int get_char(unsigned char* sym) { - if (!buffer_empty(&usartTxBuffer)) { - *sym = read_buffer(&usartTxBuffer); +int UART_get_char(unsigned char* sym) { + if (!buffer_empty(&usartRxBuffer)) { + *sym = read_buffer(&usartRxBuffer); return 1; // Символ успешно прочитан } else { return 0; // Буфер пуст, ошибка чтения } } -void USART_send_str(const unsigned char* data) { +void UART_send_str(const unsigned char* data) { while (*data) { USART_put_char(*data++); } } -uint32_t receivedByteCount = 0; +//uint32_t receivedByteCount = 0; + // Получение данных из буфера int UART_receive(uint8_t* data, size_t length) { - char overflow=0; - uint32_t byteCount=0; - uint32_t timeout_ms_mb = 100; - uint32_t timeout_ms = 4; + char overflow=0; // Флаг переполнения, который устанавливается, если превышен размер массива + uint32_t byteCount=0; // Счетчик байтов, принятых из буфера приема + uint32_t timeout_ms_mb = 100; // Таймаут в миллисекундах для ожидания первого байта в буфере приема + uint32_t timeout_ms = 4; // Таймаут в миллисекундах для общего времени приема данных uint32_t start_time = millis(); + // Цикл ожидания первого байта в буфере приема с учетом таймаута while (buffer_empty(&usartRxBuffer)) { if ((millis() - start_time) > timeout_ms_mb) { - // Обработка ошибки или таймаута + // Обработка таймаута return -1; } } + //Цикл приема данных с таймаутом while(1) { - + // Пока буфер приема не пуст и не истек таймаут общего времени, + // функция продолжает читать байты из буфера и сохранять их в массив data. while (!buffer_empty(&usartRxBuffer)) { int reader = read_buffer(&usartRxBuffer);//прием и запись символа в переменную if(byteCount<=length){ @@ -89,7 +93,7 @@ int UART_receive(uint8_t* data, size_t length) { } } - return overflow?-1:byteCount; + return overflow?-1:byteCount; // возвращает количество успешно принятых байт или -1 } @@ -108,7 +112,6 @@ int main(void) { while (1) { //unsigned long currentTime = millis(); - } return 0; } @@ -120,4 +123,3 @@ ISR(USART_RX_vect) { } } -//перезаписать чтоб освободитть байт, из udr0 diff --git a/UART/uart.h b/UART/uart.h new file mode 100644 index 0000000..c92e55b --- /dev/null +++ b/UART/uart.h @@ -0,0 +1,12 @@ +#ifndef UART_H +#define UART_H + +void UART_init(void); +void UART_send(uint8_t* data, size_t length); +void UART_put_char(unsigned char sym); +int UART_get_char(unsigned char* sym); +void UART_send_str(const unsigned char* data); +int UART_receive(uint8_t* data, size_t length); + + +#endif /* UART_H */ \ No newline at end of file