Compare commits
1
Commits
uart
..
0a2718c34f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a2718c34f |
@@ -12,4 +12,5 @@
|
|||||||
* Отрисовка данных на дисплей
|
* Отрисовка данных на дисплей
|
||||||
|
|
||||||
Деркачев Андрей
|
Деркачев Андрей
|
||||||
* Соединения и рефактор блоков UART, HDLC и вывода
|
* Соединения и рефактор блоков UART, HDLC и вывода
|
||||||
|
* Работа с I2C
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "circular_buf.h"
|
|
||||||
|
|
||||||
|
|
||||||
void clear_buffer(struct circular_buffer* cb) {
|
|
||||||
cb->buf_head = 0;
|
|
||||||
cb->buf_tail = 0;
|
|
||||||
}
|
|
||||||
// Проверка, пустой ли буфер
|
|
||||||
int buffer_empty(const struct circular_buffer* cb) {
|
|
||||||
return cb->buf_head == cb->buf_tail;
|
|
||||||
}
|
|
||||||
// Проверка, заполнен ли буфер
|
|
||||||
int buffer_full(const struct circular_buffer* cb) {
|
|
||||||
return (cb->buf_tail + 1) % BUFFER_SIZE == cb->buf_head; //проверяем следующее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывод true
|
|
||||||
}
|
|
||||||
// Запись в буфер
|
|
||||||
void write_buffer(struct circular_buffer* cb, int value) {
|
|
||||||
if (buffer_full(cb)) { // проверяем, заполнен ли буфер
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cb->buffer[cb->buf_tail] = value;// записываем значение в элемент массива в хвост
|
|
||||||
cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;// присваивается cb->buf_tail, обновляется его значение на следующий индекс в буфере
|
|
||||||
}
|
|
||||||
// Чтение элемента
|
|
||||||
int read_buffer(struct circular_buffer* cb) {
|
|
||||||
if (buffer_empty(cb)) { // проверка на пустоту
|
|
||||||
return -1;// -1 как индикатор в случае ошибки
|
|
||||||
}
|
|
||||||
int value = cb->buffer[cb->buf_head]; // чтение по индексу головы
|
|
||||||
cb->buf_head = (cb->buf_head + 1) % BUFFER_SIZE; // увеличиваем индекс на 1
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#ifndef CIRCULAR_BUFFER_H
|
|
||||||
#define CIRCULAR_BUFFER_H
|
|
||||||
|
|
||||||
#define BUFFER_SIZE 32
|
|
||||||
|
|
||||||
struct circular_buffer{
|
|
||||||
unsigned char buffer[BUFFER_SIZE];
|
|
||||||
unsigned char buf_head;
|
|
||||||
unsigned char buf_tail;
|
|
||||||
};
|
|
||||||
|
|
||||||
void clear_buffer(struct circular_buffer* cb);
|
|
||||||
int buffer_empty(const struct circular_buffer* cb);
|
|
||||||
int buffer_full(const struct circular_buffer* cb);
|
|
||||||
void write_buffer(struct circular_buffer* cb, int value);
|
|
||||||
int read_buffer(struct circular_buffer* cb);
|
|
||||||
|
|
||||||
#endif /* CIRCULAR_BUFFER_H */
|
|
||||||
-63
@@ -1,63 +0,0 @@
|
|||||||
#include <avr/io.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "circular_buf.h"
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
struct circular_buffer uartRxBuffer;
|
|
||||||
struct circular_buffer uartTxBuffer;
|
|
||||||
|
|
||||||
void UART_init(void) {
|
|
||||||
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1<<TXCIE0) | (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(&uartTxBuffer)) {
|
|
||||||
write_buffer(&uartTxBuffer, data[i]);
|
|
||||||
} else {
|
|
||||||
break; // если буфер передачи заполнен, то отправка прерывается
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UCSR0B |= (1 << TXCIE0); // включаем прерывание по завершении передачи
|
|
||||||
clear_buffer(&uartTxBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Получение данных из буфера
|
|
||||||
int UART_receive(uint8_t* data, size_t length) {
|
|
||||||
char overflow = 0; // Флаг переполнения, который устанавливается, если превышен размер массива
|
|
||||||
uint32_t byteCount = 0; // Счетчик байтов, принятых из буфера приема
|
|
||||||
// Пока буфер приема не пуст и не превышен лимит длины массива,
|
|
||||||
// функция продолжает читать байты из буфера и сохранять их в массив data.
|
|
||||||
while (!buffer_empty(&uartRxBuffer) && byteCount < length) {
|
|
||||||
int reader = read_buffer(&uartRxBuffer); // Прием и запись символа в переменную
|
|
||||||
data[byteCount] = reader; // Запись в массив с индексом byteCount
|
|
||||||
byteCount++;
|
|
||||||
}
|
|
||||||
// Проверка переполнения
|
|
||||||
if (byteCount > length) {
|
|
||||||
overflow = 1;
|
|
||||||
}
|
|
||||||
clear_buffer(&uartRxBuffer);
|
|
||||||
return overflow ? -1 : byteCount; // Возвращает количество успешно принятых байт или -1 в случае переполнения
|
|
||||||
}
|
|
||||||
|
|
||||||
// прерывание по завершению приема
|
|
||||||
ISR(USART_RX_vect) {
|
|
||||||
uint8_t data = UDR0; // читаем из регистра UDR0
|
|
||||||
if (!buffer_full(&uartRxBuffer)) {
|
|
||||||
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(USART_TX_vect) {
|
|
||||||
if (!buffer_empty(&uartTxBuffer)) {
|
|
||||||
UDR0 = read_buffer(&uartTxBuffer);
|
|
||||||
} else {
|
|
||||||
UCSR0B &= ~(1 << TXCIE0); // отключаем прерывание, когда все данные отправлены
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
#ifndef UART_H
|
|
||||||
#define UART_H
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#define F_CPU 16000000
|
|
||||||
|
|
||||||
void UART_init(void);
|
|
||||||
void UART_send(uint8_t* data, size_t length);
|
|
||||||
int UART_receive(uint8_t* data, size_t length);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* UART_H */
|
|
||||||
Reference in New Issue
Block a user