Изменил(а) на '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" #include "circular_buf.h"
#define F_CPU 16000000 #define F_CPU 16000000
#define SIZE_BUF 16
CircularBuffer usartTxBuffer; struct circular_buffer usartTxBuffer;
CircularBuffer usartRxBuffer; struct circular_buffer usartRxBuffer;
void UARTInit(void) { void UART_init(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; UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // включаем прерывание по приему и опустошению буфера передачи
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
UBRR0H = 0; UBRR0H = 0;
UBRR0L = 103; 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++) { for (size_t i = 0; i < length; i++) {
if (!BufferFull(&usartTxBuffer)) { if (!buffer_full(&usartTxBuffer)) {
writeBuffer(&usartTxBuffer, data[i]); write_buffer(&usartTxBuffer, data[i]);
} else { } 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) { void USART_put_char(unsigned char sym) {
if (((UCSR0A & (1 << UDRE0)) != 0) && BufferEmpty(&usartTxBuffer)) { if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) {
UDR0 = sym; UDR0 = sym;
} else { } else {
if (!BufferFull(&usartTxBuffer)) { if (!buffer_full(&usartTxBuffer)) {
writeBuffer(&usartTxBuffer, sym); write_buffer(&usartTxBuffer, sym);
} else { } 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) { int get_char(unsigned char* sym) {
if (!BufferEmpty(&usartTxBuffer)) { if (!buffer_empty(&usartTxBuffer)) {
*sym = readBuffer(&usartTxBuffer); *sym = read_buffer(&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; return 1; // Успешно прочитан символ из буфера передачи
} else { } 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) { 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 timeout_ms_mb = 100;
uint32_t timeout_ms = 4;
uint32_t start_time = millis();
while (BufferEmpty(&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;
}
}
data[0] = readBuffer(&usartRxBuffer);
start_time = millis();
while (!BufferEmpty(&usartRxBuffer)) {
if ((millis() - start_time) > timeout_ms) {
break;
}
} }
} }
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) { int main(void) {
sei(); sei();
UARTInit(); UART_init();
timerInit(); timerInit();
DDRD = 0xFF; DDRD = 0xFF;
uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09}; uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09};
UARTSend(buff, sizeof(buff)); //UART_send(buff, sizeof(buff));
//
uint8_t receivedData[SIZE_BUF]; //uint8_t receivedData[BUFFER_SIZE];
UARTReceive(receivedData); //UART_receive(receivedData,sizeof(receivedData));
UARTSend(receivedData, sizeof(receivedData)); //UART_send(receivedData, sizeof(receivedData));
while (1) { while (1) {
//unsigned long currentTime = millis(); //unsigned long currentTime = millis();
@ -93,22 +112,16 @@ int main(void) {
} }
return 0; return 0;
} }
//прерывание по завершению приема
ISR(USART_RX_vect) { ISR(USART_RX_vect) {
if (!BufferFull(&usartRxBuffer)) { if (!buffer_full(&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; write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема
} }
if (!BufferEmpty(&usartTxBuffer)) { else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную
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 { uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0
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; // Дальнейшая обработка данных в overflowData
} }
} }
//перезаписать чтоб освободитть байт, из udr0