Изменил(а) на 'UART/main.c'

This commit is contained in:
Никита Солодянкин 2023-06-17 16:48:12 +00:00
parent cac4258352
commit 2739418e23

View File

@ -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); // &#1074;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1087;&#1088;&#1080;&#1077;&#1084;&#1091; &#1080; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
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; // &#1073;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1079;&#1072;&#1087;&#1086;&#1083;&#1085;&#1077;&#1085;, &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1077;&#1084; &#1086;&#1090;&#1087;&#1088;&#1072;&#1074;&#1082;&#1091;
break; // буфер передачи заполнен, прерываем отправку
}
}
UCSR0B |= (1 << UDRIE0); // &#1042;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
}
//&#1087;&#1086;&#1083;&#1086;&#1078;&#1080;&#1090;&#1100; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1074; &#1073;&#1091;&#1092;&#1077;&#1088;
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 {
// &#1041;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1087;&#1086;&#1083;&#1086;&#1085;, &#1086;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1080; &#1080;&#1083;&#1080; &#1076;&#1088;&#1091;&#1075;&#1072;&#1103; &#1083;&#1086;&#1075;&#1080;&#1082;&#1072;
// Буфер передачи полон, обработка ошибки или другая логика
}
}
}
//&#1074;&#1079;&#1103;&#1090;&#1100; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;
int GetChar(unsigned char* sym) {
if (!BufferEmpty(&usartTxBuffer)) {
*sym = readBuffer(&usartTxBuffer);
return 1; // &#1059;&#1089;&#1087;&#1077;&#1096;&#1085;&#1086; &#1087;&#1088;&#1086;&#1095;&#1080;&#1090;&#1072;&#1085; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
//взять символ из буфера
int get_char(unsigned char* sym) {
if (!buffer_empty(&usartTxBuffer)) {
*sym = read_buffer(&usartTxBuffer);
return 1; // Успешно прочитан символ из буфера передачи
} else {
return 0; // &#1041;&#1091;&#1092;&#1077;&#1088; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080; &#1087;&#1091;&#1089;&#1090;, &#1074;&#1086;&#1079;&#1085;&#1080;&#1082;&#1083;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1072; &#1095;&#1090;&#1077;&#1085;&#1080;&#1103;
return 0; // Буфер передачи пуст, возникла ошибка чтения
}
}
//&#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1103; &#1079;&#1072;&#1075;&#1088;&#1091;&#1079;&#1082;&#1080; &#1089;&#1090;&#1088;&#1086;&#1082;
void USART_SendStr(const unsigned char* data) {
//функция загрузки строк
void USART_send_str(const unsigned char* data) {
while (*data) {
USART_PutChar(*data++);
USART_put_char(*data++);
}
}
//&#1087;&#1086;&#1083;&#1091;&#1095;&#1072;&#1077;&#1084; &#1076;&#1072;&#1085;&#1085;&#1099;&#1077; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072;
void UARTReceive(uint8_t* 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 (BufferEmpty(&usartRxBuffer)) {
while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой
if ((millis() - start_time) > timeout_ms_mb) {
// &#1054;&#1073;&#1088;&#1072;&#1073;&#1086;&#1090;&#1082;&#1072; &#1086;&#1096;&#1080;&#1073;&#1082;&#1080; &#1080;&#1083;&#1080; &#1090;&#1072;&#1081;&#1084;&#1072;&#1091;&#1090;&#1072; &#1087;&#1088;&#1080;&#1077;&#1084;&#1072;
return 0;
// Обработка ошибки или таймаута приема
return -1;
}
}
data[0] = readBuffer(&usartRxBuffer);
start_time = millis();
while (!BufferEmpty(&usartRxBuffer)) {
if ((millis() - start_time) > timeout_ms) {
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);// &#1047;&#1072;&#1087;&#1080;&#1089;&#1099;&#1074;&#1072;&#1077;&#1084; &#1087;&#1088;&#1080;&#1085;&#1103;&#1090;&#1099;&#1081; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1074; &#1073;&#1091;&#1092;&#1077;&#1088; &#1087;&#1088;&#1080;&#1077;&#1084;&#1072;
if (!buffer_full(&usartRxBuffer)) {
write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема
}
if (!BufferEmpty(&usartTxBuffer)) {
UDR0 = readBuffer(&usartTxBuffer);// &#1054;&#1090;&#1087;&#1088;&#1072;&#1074;&#1083;&#1103;&#1077;&#1084; &#1089;&#1080;&#1084;&#1074;&#1086;&#1083; &#1080;&#1079; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
} else {
UCSR0B &= ~(1 << UDRIE0); // &#1054;&#1090;&#1082;&#1083;&#1102;&#1095;&#1072;&#1077;&#1084; &#1087;&#1088;&#1077;&#1088;&#1099;&#1074;&#1072;&#1085;&#1080;&#1077; &#1087;&#1086; &#1086;&#1087;&#1091;&#1089;&#1090;&#1086;&#1096;&#1077;&#1085;&#1080;&#1102; &#1073;&#1091;&#1092;&#1077;&#1088;&#1072; &#1087;&#1077;&#1088;&#1077;&#1076;&#1072;&#1095;&#1080;
else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную
uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0
// Дальнейшая обработка данных в overflowData
}
}
//перезаписать чтоб освободитть байт, из udr0