7 Commits
Author SHA1 Message Date
stud126791 51bcae6458 Изменил(а) на 'UART/main.c' 2023-06-18 11:00:30 +00:00
stud126791 e22c380faa Изменил(а) на 'UART/circular_buf.h' 2023-06-18 10:59:28 +00:00
stud126791 4956ae0a24 Изменил(а) на 'UART/circular_buf.c' 2023-06-18 10:59:07 +00:00
stud126791 2739418e23 Изменил(а) на 'UART/main.c' 2023-06-17 16:48:12 +00:00
stud126791 cac4258352 Изменил(а) на 'UART/main.c'
с изменениями под новый кольцевой буфер
2023-06-16 22:21:42 +00:00
stud126791 cb281d378e Изменил(а) на 'UART/main.c' 2023-06-16 22:19:56 +00:00
stud126791 f83f5bfa9f Удалить 'UART/ring_buf.c' 2023-06-16 21:39:45 +00:00
4 changed files with 174 additions and 255 deletions
+36 -42
View File
@@ -1,42 +1,36 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "circular_buf.h"
#define BUFFER_SIZE 10
typedef struct { void initialize_buffer(struct circular_buffer* cb) {
int buffer[BUFFER_SIZE]; cb->buf_head = 0;
int BufHead; cb->buf_tail = 0;
int BufTail; }
} CircularBuffer; // Проверка, является ли буфер пустым
int buffer_empty(const struct circular_buffer* cb) {
void initializeBuffer(CircularBuffer* cb) { return cb->buf_head == cb->buf_tail;
cb->BufHead = 0; }
cb->BufTail = 0; // Проверка, является ли буфер полным
} int buffer_full(const struct circular_buffer* cb) {
// Проверка, является ли буфер пустым return (cb->buf_tail + 1) % BUFFER_SIZE == cb->buf_head;//проверяем слудеющее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывыедет true
int BufferEmpty(const CircularBuffer* cb) { }
return cb->BufHead == cb->BufTail; // Запись элемента в буфер
} void write_buffer(struct circular_buffer* cb, int value) {
// Проверка, является ли буфер полным if (buffer_full(cb)) { // проверка на заполненность
int BufferFull(const CircularBuffer* cb) { return;
return (cb->BufTail + 1) % BUFFER_SIZE == cb->BufHead;//проверяем слудеющее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывыедет true }
} cb->buffer[cb->buf_tail] = value;//записывает значение value в элемент массива buffer в хвост
// Запись элемента в буфер cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;//присваивается cb->buf_tail, обновляя его значение на следующий индекс в кольцевом буфере
void writeBuffer(CircularBuffer* cb, int value) { }
if (BufferFull(cb)) { // проверка на заполненность // Чтение элемента из буфера
return; int read_buffer(struct circular_buffer* cb) {
} if (buffer_empty(cb)) { //проверяет буффер на пустоту
cb->buffer[cb->BufTail] = value;//записывает значение value в элемент массива buffer в хвост return -1;// -1 в качестве индикатора ошибки
cb->BufTail = (cb->BufTail + 1) % BUFFER_SIZE;//присваивается cb->BufTail, обновляя его значение на следующий индекс в кольцевом буфере }
} int value = cb->buffer[cb->buf_head]; //читаем значение из массива по индексу головы
// Чтение элемента из буфера cb->buf_head = (cb->buf_head + 1) % BUFFER_SIZE; //увеличиваем индекс головы +1
int readBuffer(CircularBuffer* cb) { return value;
if (BufferEmpty(cb)) { //проверяет буффер на пустоту }
return -1;// -1 в качестве индикатора ошибки
}
int value = cb->buffer[cb->BufHead]; //читаем значение из массива по индексу головы
cb->BufHead = (cb->BufHead + 1) % BUFFER_SIZE; //увеличиваем индекс головы +1
return value;
}
+18 -18
View File
@@ -1,18 +1,18 @@
#ifndef CIRCULAR_BUFFER_H #ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H #define CIRCULAR_BUFFER_H
#define BUFFER_SIZE 10 #define BUFFER_SIZE 32
typedef struct { struct circular_buffer{
int buffer[BUFFER_SIZE]; unsigned char buffer[BUFFER_SIZE];
int BufHead; unsigned char buf_head;
int BufTail; unsigned char buf_tail;
} CircularBuffer; };
void initializeBuffer(CircularBuffer* cb); void initialize_buffer(struct circular_buffer* cb);
int BufferEmpty(const CircularBuffer* cb); int buffer_empty(const struct circular_buffer* cb);
int BufferFull(const CircularBuffer* cb); int buffer_full(const struct circular_buffer* cb);
void writeBuffer(CircularBuffer* cb, int value); void write_buffer(struct circular_buffer* cb, int value);
int readBuffer(CircularBuffer* cb); int read_buffer(struct circular_buffer* cb);
#endif /* CIRCULAR_BUFFER_H */ #endif /* CIRCULAR_BUFFER_H */
+120 -153
View File
@@ -1,156 +1,123 @@
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "timer.h" #include "timer.h"
#include "circular_buf.h" #include "circular_buf.h"
#define F_CPU 16000000 #define F_CPU 16000000
#define SIZE_BUF 16
struct circular_buffer usartTxBuffer;
struct circular_buffer usartRxBuffer;
volatile unsigned char usartTxBuf[SIZE_BUF]; void UART_init(void) {
volatile unsigned char txBufTail = 0; UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // включаем прерывание по приему и опустошению буфера передачи
volatile unsigned char txBufHead = 0; UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
volatile unsigned char txCount = 0; UBRR0H = 0;
UBRR0L = 103;
volatile unsigned char usartRxBuf[SIZE_BUF]; }
volatile unsigned char rxBufTail = 0;
volatile unsigned char rxBufHead = 0; void UART_send(uint8_t* data, size_t length) {
volatile unsigned char rxCount = 0; for (size_t i = 0; i < length; i++) {
if (!buffer_full(&usartTxBuffer)) {
write_buffer(&usartTxBuffer, data[i]);
} else {
void UARTInit(void) { break; // буфер передачи заполнен, прерываем отправку
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << TXCIE0); }
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); }
UBRR0H = 0; UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
UBRR0L = 103; }
} //положить символ в буфер
void USART_put_char(unsigned char sym) {
void UARTSend(uint8_t* data, size_t length) { if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) {
for (size_t i = 0; i < length; i++) { // Æä¸ì îïóñòîøåíèÿ áóôåðà ïåðåäà÷è (÷èòàåì ôëàã). UDR0 = sym;
while (!(UCSR0A & (1 << UDRE0))); } else {
UDR0 = data[i];// Çàïèñûâàåì â ðåãèñòð çíà÷åíèå ïåðåìåííîé "data" äëÿ ïåðåäà÷è. if (!buffer_full(&usartTxBuffer)) {
} write_buffer(&usartTxBuffer, sym);
} } else {
//ïîëîæèòü ñèìâîë â áóôåð // Буфер передачи полон, обработка ошибки или другая логика
void USART_PutChar(unsigned char sym) { }
if (((UCSR0A & (1 << UDRE0)) != 0) && (txCount == 0)) { }
UDR0 = sym; }
} else { //взять символ из буфера
if (txCount < SIZE_BUF) { int get_char(unsigned char* sym) {
usartTxBuf[txBufTail] = sym; if (!buffer_empty(&usartTxBuffer)) {
txCount++; *sym = read_buffer(&usartTxBuffer);
txBufTail++; return 1; // Успешно прочитан символ из буфера передачи
if (txBufTail == SIZE_BUF) { } else {
txBufTail = 0; return 0; // Буфер передачи пуст, возникла ошибка чтения
} }
} }
} //функция загрузки строк
} void USART_send_str(const unsigned char* data) {
//âçÿòü ñèìâîë èç áóôåðà while (*data) {
unsigned char GetChar(void) { USART_put_char(*data++);
unsigned char sym = 0; }
if (txCount > 0) { }
sym = usartTxBuf[txBufHead];
txCount--; uint32_t receivedByteCount = 0;
txBufHead++; //получаем данные из буфера
if (txBufHead == SIZE_BUF) { int UART_receive(uint8_t* data, size_t length) {
txBufHead = 0; char overflow=0;
} uint32_t byteCount=0;
} uint32_t timeout_ms_mb = 100;
return sym; uint32_t timeout_ms = 4;
} uint32_t start_time = millis();
//ôóíêöèÿ çàãðóçêè ñòðîê while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой
void USART_SendStr(const unsigned char* data) { if ((millis() - start_time) > timeout_ms_mb) {
while (*data) { // Обработка ошибки или таймаута приема
USART_PutChar(*data++); return -1;
} }
} }
//ïîëó÷àåì äàííûå èç áóôåðà while(1)
void UARTReceive(uint8_t* data) { {
uint32_t timeout_ms_mb = 100;//timeout 100ms, â íàøåì ñëó÷àå, èíîãäà ïî 1 ñåê, è äàæå ïî 4-5 ñ, åñëè áàéò ïîâðåäèëñÿ è èäåò îêîëî 1-2ñåêóíä, òî øòîðà ìîæåò ñëîìàòüñÿ
uint32_t timeout_ms = 4; while (!buffer_empty(&usartRxBuffer)) { //пока буффер не пустой
uint32_t start_time = millis();//çàïîìèíàåì âðåìÿ íà÷àëà îæèäàíèÿ int reader = read_buffer(&usartRxBuffer);//принимаем символ в переменную
while (rxCount == 0) { //îæèäàíèå íàëè÷èÿ äàííûõ â áóôåðå ïðè¸ìà if(byteCount<=length){
if ((millis() - start_time) > timeout_ms_mb) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî data[byteCount] = reader; //записываем в массив с индексом byteCount
return 0; //âûõîäèì èç öèêëà }
} else{
} overflow=1;
data[0] = usartRxBuf[rxBufHead];//ñ÷èòûâàíèå áàéòà èç áóôåðà }
rxCount--; byteCount++; //+1 к счетчику
rxBufHead++;
if (rxBufHead == SIZE_BUF) { start_time = millis();
rxBufHead = 0; }
} if ((millis() - start_time) > timeout_ms) { //если привыслии время в 4 ms
start_time = millis();//îáíóëÿåì òàéìàóò, òàê êàê äàííûå íà÷àëè ïðèõîäèòü break;
while (rxCount > 0) { //îæèäàíèå îêîí÷àíèÿ ïðè¸ìà äàííûõ }
if ((millis() - start_time) > timeout_ms) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî
break; //âûõîäèì èç öèêëà îæèäàíèÿ }
} return overflow?-1:byteCount;
} }
}
int main(void) {
sei();
UARTInit();
timerInit();
DDRD = 0xFF;
uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09};
UARTSend(buff, sizeof(buff));
//for (int i = 0; i < 7; i++) {
//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 (rxCount < SIZE_BUF) {
usartRxBuf[rxBufTail] = UDR0;
rxBufTail++;
if (rxBufTail == SIZE_BUF) {
rxBufTail = 0;
}
rxCount++;
}
}
////îáðàáîò÷èê ïðåðûâàíèÿ ïî çàâåðøåíèþ ïåðåäà÷è
//ISR(USART_TXC_vect) {
//if (txCount > 0){ //åñëè áóôåð íå ïóñòîé
//UDR0 = usartTxBuf[txBufHead]; //çàïèñûâàåì â UDR ñèìâîë èç áóôåðà
//txCount--; //óìåíüøàåì ñ÷åò÷èê ñèìâîëîâ
//txBufHead++; //èíêðåìåíòèðóåì èíäåêñ ãîëîâû áóôåðà
//if (txBufHead == SIZE_BUF)
//txBufHead = 0;
//}
//else {
//UCSR0B &= ~(0<<TXCIE0);
//}
//
//// rx_data = UDR0; //Â íåì äàííûå èç ïðèåìíîãî áóôåðà UDR ïåðåíîñÿòñÿ â ãëîáàëüíóþ ïåðåìåííóþ rx_data
//// rx_flag = 1; //âûñòàâëÿåòñÿ ôëàã rx_flag, ãîâîðÿùèé î òîì, ÷òî ïðèåì çàâåðøåí
//}
int main(void) {
sei();
UART_init();
timerInit();
DDRD = 0xFF;
uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09};
//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();
}
return 0;
}
//прерывание по завершению приема
ISR(USART_RX_vect) {
uint8_t data = UDR0; // прочитать символ из регистра UDR0
if (!buffer_full(&usartRxBuffer)) {
write_buffer(&usartRxBuffer, data);// записываем принятый символ в буфер приема
}
}
//перезаписать чтоб освободитть байт, из udr0
-42
View File
@@ -1,42 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10
typedef struct {
int buffer[BUFFER_SIZE];
int BufHead;
int BufTail;
} CircularBuffer;
void initializeBuffer(CircularBuffer* cb) {
cb->BufHead = 0;
cb->BufTail = 0;
}
// Проверка, является ли буфер пустым
int BufferEmpty(const CircularBuffer* cb) {
return cb->BufHead == cb->BufTail;
}
// Проверка, является ли буфер полным
int BufferFull(const CircularBuffer* cb) {
return (cb->BufTail + 1) % BUFFER_SIZE == cb->BufHead;//проверяем слудеющее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывыедет true
}
// Запись элемента в буфер
void writeBuffer(CircularBuffer* cb, int value) {
if (BufferFull(cb)) { // проверка на заполненность
return;
}
cb->buffer[cb->BufTail] = value;//записывает значение value в элемент массива buffer в хвост
cb->BufTail = (cb->BufTail + 1) % BUFFER_SIZE;//присваивается cb->BufTail, обновляя его значение на следующий индекс в кольцевом буфере
}
// Чтение элемента из буфера
int readBuffer(CircularBuffer* cb) {
if (BufferEmpty(cb)) { //проверяет буффер на пустоту
return -1;// -1 в качестве индикатора ошибки
}
int value = cb->buffer[cb->BufHead]; //читаем значение из массива по индексу головы
cb->BufHead = (cb->BufHead + 1) % BUFFER_SIZE; //увеличиваем индекс головы +1
return value;
}