From 2739418e23319fc08e9ceac570e81f9d6480faf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=A1=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B4=D1=8F=D0=BD=D0=BA=D0=B8=D0=BD?= Date: Sat, 17 Jun 2023 16:48:12 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'UART/main.c'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UART/main.c | 141 ++++++++++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 64 deletions(-) diff --git a/UART/main.c b/UART/main.c index 347777a..38a02bc 100644 --- a/UART/main.c +++ b/UART/main.c @@ -6,86 +6,105 @@ #include "circular_buf.h" #define F_CPU 16000000 -#define SIZE_BUF 16 -CircularBuffer usartTxBuffer; -CircularBuffer usartRxBuffer; +struct circular_buffer usartTxBuffer; +struct circular_buffer usartRxBuffer; -void UARTInit(void) { - UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // включаем прерывание по приему и опустошению буфера передачи +void UART_init(void) { + UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // включаем прерывание по приему и опустошению буфера передачи UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UBRR0H = 0; UBRR0L = 103; } -void UARTSend(uint8_t* data, size_t length) { +void UART_send(uint8_t* data, size_t length) { for (size_t i = 0; i < length; i++) { - if (!BufferFull(&usartTxBuffer)) { - writeBuffer(&usartTxBuffer, data[i]); + if (!buffer_full(&usartTxBuffer)) { + write_buffer(&usartTxBuffer, data[i]); } else { - break; // буфер передачи заполнен, прерываем отправку + break; // буфер передачи заполнен, прерываем отправку } } - UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи + UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи } -//положить символ в буфер -void USART_PutChar(unsigned char sym) { - if (((UCSR0A & (1 << UDRE0)) != 0) && BufferEmpty(&usartTxBuffer)) { +//положить символ в буфер +void USART_put_char(unsigned char sym) { + if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) { UDR0 = sym; } else { - if (!BufferFull(&usartTxBuffer)) { - writeBuffer(&usartTxBuffer, sym); + if (!buffer_full(&usartTxBuffer)) { + write_buffer(&usartTxBuffer, sym); } else { - // Буфер передачи полон, обработка ошибки или другая логика + // Буфер передачи полон, обработка ошибки или другая логика } } } -//взять символ из буфера -int GetChar(unsigned char* sym) { - if (!BufferEmpty(&usartTxBuffer)) { - *sym = readBuffer(&usartTxBuffer); - return 1; // Успешно прочитан символ из буфера передачи +//взять символ из буфера +int get_char(unsigned char* sym) { + if (!buffer_empty(&usartTxBuffer)) { + *sym = read_buffer(&usartTxBuffer); + return 1; // Успешно прочитан символ из буфера передачи } else { - return 0; // Буфер передачи пуст, возникла ошибка чтения + return 0; // Буфер передачи пуст, возникла ошибка чтения } } -//функция загрузки строк -void USART_SendStr(const unsigned char* data) { +//функция загрузки строк +void USART_send_str(const unsigned char* data) { while (*data) { - USART_PutChar(*data++); - } -} -//получаем данные из буфера -void UARTReceive(uint8_t* data) { - uint32_t timeout_ms_mb = 100; - uint32_t timeout_ms = 4; - uint32_t start_time = millis(); - while (BufferEmpty(&usartRxBuffer)) { - if ((millis() - start_time) > timeout_ms_mb) { - // Обработка ошибки или таймаута приема - return 0; - } - } - data[0] = readBuffer(&usartRxBuffer); - start_time = millis(); - while (!BufferEmpty(&usartRxBuffer)) { - if ((millis() - start_time) > timeout_ms) { - break; - } + USART_put_char(*data++); } } +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; + uint32_t start_time = millis(); + while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой + if ((millis() - start_time) > timeout_ms_mb) { + // Обработка ошибки или таймаута приема + return -1; + } + } + while(1) + { + + while (!buffer_empty(&usartRxBuffer)) { //пока буффер не пустой + int reader = read_buffer(&usartRxBuffer);//принимаем символ в переменную + if(byteCount<=length){ + data[byteCount] = reader; //записываем в массив с индексом byteCount + } + else{ + overflow=1; + } + byteCount++; //+1 к счетчику + + start_time = millis(); + } + if ((millis() - start_time) > timeout_ms) { //если привыслии время в 4 ms + break; + } + + } + return overflow?-1:byteCount; +} + + + int main(void) { sei(); - UARTInit(); + UART_init(); timerInit(); DDRD = 0xFF; uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09}; - UARTSend(buff, sizeof(buff)); - - uint8_t receivedData[SIZE_BUF]; - UARTReceive(receivedData); - UARTSend(receivedData, sizeof(receivedData)); + //UART_send(buff, sizeof(buff)); + // + //uint8_t receivedData[BUFFER_SIZE]; + //UART_receive(receivedData,sizeof(receivedData)); + //UART_send(receivedData, sizeof(receivedData)); while (1) { //unsigned long currentTime = millis(); @@ -93,22 +112,16 @@ int main(void) { } return 0; } - +//прерывание по завершению приема ISR(USART_RX_vect) { - if (!BufferFull(&usartRxBuffer)) { - writeBuffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема + if (!buffer_full(&usartRxBuffer)) { + write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема } - if (!BufferEmpty(&usartTxBuffer)) { - UDR0 = readBuffer(&usartTxBuffer);// Отправляем символ из буфера передачи - } else { - UCSR0B &= ~(1 << UDRIE0); // Отключаем прерывание по опустошению буфера передачи + else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную + + uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0 + // Дальнейшая обработка данных в overflowData } } - - - - - - - +//перезаписать чтоб освободитть байт, из udr0