#include #include #include #include #include "timer.h" #include "circular_buf.h" #define F_CPU 16000000 struct circular_buffer usartTxBuffer; struct circular_buffer usartRxBuffer; 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++) { if (!buffer_full(&usartTxBuffer)) { write_buffer(&usartTxBuffer, data[i]); } else { break; // буфер передачи заполнен, прерываем отправку } } UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи } //положить символ в буфер void USART_put_char(unsigned char sym) { if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) { UDR0 = sym; } else { if (!buffer_full(&usartTxBuffer)) { write_buffer(&usartTxBuffer, sym); } else { // Буфер передачи полон, обработка ошибки или другая логика } } } //взять символ из буфера int get_char(unsigned char* sym) { if (!buffer_empty(&usartTxBuffer)) { *sym = read_buffer(&usartTxBuffer); return 1; // Успешно прочитан символ из буфера передачи } else { return 0; // Буфер передачи пуст, возникла ошибка чтения } } //функция загрузки строк void USART_send_str(const unsigned char* data) { while (*data) { 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(); UART_init(); timerInit(); DDRD = 0xFF; uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09}; //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(); } return 0; } //прерывание по завершению приема ISR(USART_RX_vect) { if (!buffer_full(&usartRxBuffer)) { write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема } else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0 // Дальнейшая обработка данных в overflowData } } //перезаписать чтоб освободитть байт, из udr0