UART modified and added header file

This commit is contained in:
Kirill Kurshakow 2024-01-17 16:11:54 +03:00
parent e6a1ad36c2
commit 93c44a6f13
2 changed files with 29 additions and 15 deletions

View File

@ -28,7 +28,7 @@ void UART_send(uint8_t* data, size_t length) {
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера
} }
void USART_put_char(unsigned char sym) { void UART_put_char(unsigned char sym) {
if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) { if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) {
UDR0 = sym; UDR0 = sym;
} else { } else {
@ -40,38 +40,42 @@ void USART_put_char(unsigned char sym) {
} }
} }
int get_char(unsigned char* sym) { int UART_get_char(unsigned char* sym) {
if (!buffer_empty(&usartTxBuffer)) { if (!buffer_empty(&usartRxBuffer)) {
*sym = read_buffer(&usartTxBuffer); *sym = read_buffer(&usartRxBuffer);
return 1; // Символ успешно прочитан return 1; // Символ успешно прочитан
} else { } else {
return 0; // Буфер пуст, ошибка чтения return 0; // Буфер пуст, ошибка чтения
} }
} }
void USART_send_str(const unsigned char* data) { void UART_send_str(const unsigned char* data) {
while (*data) { while (*data) {
USART_put_char(*data++); USART_put_char(*data++);
} }
} }
uint32_t receivedByteCount = 0; //uint32_t receivedByteCount = 0;
// Получение данных из буфера // Получение данных из буфера
int UART_receive(uint8_t* data, size_t length) { int UART_receive(uint8_t* data, size_t length) {
char overflow=0; char overflow=0; // Флаг переполнения, который устанавливается, если превышен размер массива
uint32_t byteCount=0; uint32_t byteCount=0; // Счетчик байтов, принятых из буфера приема
uint32_t timeout_ms_mb = 100; uint32_t timeout_ms_mb = 100; // Таймаут в миллисекундах для ожидания первого байта в буфере приема
uint32_t timeout_ms = 4; uint32_t timeout_ms = 4; // Таймаут в миллисекундах для общего времени приема данных
uint32_t start_time = millis(); uint32_t start_time = millis();
// Цикл ожидания первого байта в буфере приема с учетом таймаута
while (buffer_empty(&usartRxBuffer)) { while (buffer_empty(&usartRxBuffer)) {
if ((millis() - start_time) > timeout_ms_mb) { if ((millis() - start_time) > timeout_ms_mb) {
// Обработка ошибки или таймаута // Обработка таймаута
return -1; return -1;
} }
} }
//Цикл приема данных с таймаутом
while(1) while(1)
{ {
// Пока буфер приема не пуст и не истек таймаут общего времени,
// функция продолжает читать байты из буфера и сохранять их в массив data.
while (!buffer_empty(&usartRxBuffer)) { while (!buffer_empty(&usartRxBuffer)) {
int reader = read_buffer(&usartRxBuffer);//прием и запись символа в переменную int reader = read_buffer(&usartRxBuffer);//прием и запись символа в переменную
if(byteCount<=length){ if(byteCount<=length){
@ -89,7 +93,7 @@ int UART_receive(uint8_t* data, size_t length) {
} }
} }
return overflow?-1:byteCount; return overflow?-1:byteCount; // возвращает количество успешно принятых байт или -1
} }
@ -108,7 +112,6 @@ int main(void) {
while (1) { while (1) {
//unsigned long currentTime = millis(); //unsigned long currentTime = millis();
} }
return 0; return 0;
} }
@ -120,4 +123,3 @@ ISR(USART_RX_vect) {
} }
} }
//перезаписать чтоб освободитть байт, из udr0

12
UART/uart.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef UART_H
#define UART_H
void UART_init(void);
void UART_send(uint8_t* data, size_t length);
void UART_put_char(unsigned char sym);
int UART_get_char(unsigned char* sym);
void UART_send_str(const unsigned char* data);
int UART_receive(uint8_t* data, size_t length);
#endif /* UART_H */