120 lines
5.6 KiB
C
120 lines
5.6 KiB
C
#include <avr/io.h>
|
||
#include <avr/interrupt.h>
|
||
#include <stdint.h>
|
||
#include <string.h>
|
||
#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); // Отключаем прерывание по опустошению буфера передачи
|
||
}
|
||
}
|
||
|
||
|
||
//
|
||
//// rx_data = UDR0; //<2F> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> rx_data
|
||
//// rx_flag = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> rx_flag, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
//}
|
||
|
||
|
||
|
||
|
||
|
||
|