#include #include #include #include #include "timer.h" #include "circular_buf.h" #define F_CPU 16000000 #define SIZE_BUF 16 CircularBuffer usartTxBuffer; CircularBuffer usartRxBuffer; void UARTInit(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) { for (size_t i = 0; i < length; i++) { if (!BufferFull(&usartTxBuffer)) { writeBuffer(&usartTxBuffer, data[i]); } else { break; // буфер передачи заполнен, прерываем отправку } } UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи } //положить символ в буфер void USART_PutChar(unsigned char sym) { if (((UCSR0A & (1 << UDRE0)) != 0) && BufferEmpty(&usartTxBuffer)) { UDR0 = sym; } else { if (!BufferFull(&usartTxBuffer)) { writeBuffer(&usartTxBuffer, sym); } else { // Буфер передачи полон, обработка ошибки или другая логика } } } //взять символ из буфера int GetChar(unsigned char* sym) { if (!BufferEmpty(&usartTxBuffer)) { *sym = readBuffer(&usartTxBuffer); return 1; // Успешно прочитан символ из буфера передачи } else { return 0; // Буфер передачи пуст, возникла ошибка чтения } } //функция загрузки строк void USART_SendStr(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; } } } int main(void) { sei(); UARTInit(); 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)); while (1) { //unsigned long currentTime = millis(); } return 0; } ISR(USART_RX_vect) { if (!BufferFull(&usartRxBuffer)) { writeBuffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема } if (!BufferEmpty(&usartTxBuffer)) { UDR0 = readBuffer(&usartTxBuffer);// Отправляем символ из буфера передачи } else { UCSR0B &= ~(1 << UDRIE0); // Отключаем прерывание по опустошению буфера передачи } }