Compare commits
7
Commits
6ee102f904
..
uart
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51bcae6458 | ||
|
|
e22c380faa | ||
|
|
4956ae0a24 | ||
|
|
2739418e23 | ||
|
|
cac4258352 | ||
|
|
cb281d378e | ||
|
|
f83f5bfa9f |
+16
-22
@@ -1,41 +1,35 @@
|
|||||||
#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;
|
|
||||||
|
|
||||||
void initializeBuffer(CircularBuffer* cb) {
|
|
||||||
cb->BufHead = 0;
|
|
||||||
cb->BufTail = 0;
|
|
||||||
}
|
}
|
||||||
// Проверка, является ли буфер пустым
|
// Проверка, является ли буфер пустым
|
||||||
int BufferEmpty(const CircularBuffer* cb) {
|
int buffer_empty(const struct circular_buffer* cb) {
|
||||||
return cb->BufHead == cb->BufTail;
|
return cb->buf_head == cb->buf_tail;
|
||||||
}
|
}
|
||||||
// Проверка, является ли буфер полным
|
// Проверка, является ли буфер полным
|
||||||
int BufferFull(const CircularBuffer* cb) {
|
int buffer_full(const struct circular_buffer* cb) {
|
||||||
return (cb->BufTail + 1) % BUFFER_SIZE == cb->BufHead;//проверяем слудеющее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывыедет true
|
return (cb->buf_tail + 1) % BUFFER_SIZE == cb->buf_head;//проверяем слудеющее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывыедет true
|
||||||
}
|
}
|
||||||
// Запись элемента в буфер
|
// Запись элемента в буфер
|
||||||
void writeBuffer(CircularBuffer* cb, int value) {
|
void write_buffer(struct circular_buffer* cb, int value) {
|
||||||
if (BufferFull(cb)) { // проверка на заполненность
|
if (buffer_full(cb)) { // проверка на заполненность
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cb->buffer[cb->BufTail] = value;//записывает значение value в элемент массива buffer в хвост
|
cb->buffer[cb->buf_tail] = value;//записывает значение value в элемент массива buffer в хвост
|
||||||
cb->BufTail = (cb->BufTail + 1) % BUFFER_SIZE;//присваивается cb->BufTail, обновляя его значение на следующий индекс в кольцевом буфере
|
cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;//присваивается cb->buf_tail, обновляя его значение на следующий индекс в кольцевом буфере
|
||||||
}
|
}
|
||||||
// Чтение элемента из буфера
|
// Чтение элемента из буфера
|
||||||
int readBuffer(CircularBuffer* cb) {
|
int read_buffer(struct circular_buffer* cb) {
|
||||||
if (BufferEmpty(cb)) { //проверяет буффер на пустоту
|
if (buffer_empty(cb)) { //проверяет буффер на пустоту
|
||||||
return -1;// -1 в качестве индикатора ошибки
|
return -1;// -1 в качестве индикатора ошибки
|
||||||
}
|
}
|
||||||
int value = cb->buffer[cb->BufHead]; //читаем значение из массива по индексу головы
|
int value = cb->buffer[cb->buf_head]; //читаем значение из массива по индексу головы
|
||||||
cb->BufHead = (cb->BufHead + 1) % BUFFER_SIZE; //увеличиваем индекс головы +1
|
cb->buf_head = (cb->buf_head + 1) % BUFFER_SIZE; //увеличиваем индекс головы +1
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -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 */
|
||||||
|
|||||||
+73
-106
@@ -6,151 +6,118 @@
|
|||||||
#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;
|
||||||
|
|
||||||
|
void UART_init(void) {
|
||||||
volatile unsigned char usartTxBuf[SIZE_BUF];
|
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << UDRIE0); // включаем прерывание по приему и опустошению буфера передачи
|
||||||
volatile unsigned char txBufTail = 0;
|
|
||||||
volatile unsigned char txBufHead = 0;
|
|
||||||
volatile unsigned char txCount = 0;
|
|
||||||
|
|
||||||
volatile unsigned char usartRxBuf[SIZE_BUF];
|
|
||||||
volatile unsigned char rxBufTail = 0;
|
|
||||||
volatile unsigned char rxBufHead = 0;
|
|
||||||
volatile unsigned char rxCount = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void UARTInit(void) {
|
|
||||||
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1 << TXCIE0);
|
|
||||||
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++) {
|
||||||
while (!(UCSR0A & (1 << UDRE0)));
|
if (!buffer_full(&usartTxBuffer)) {
|
||||||
UDR0 = data[i];// Çàïèñûâàåì â ðåãèñòð çíà÷åíèå ïåðåìåííîé "data" äëÿ ïåðåäà÷è.
|
write_buffer(&usartTxBuffer, data[i]);
|
||||||
|
} else {
|
||||||
|
break; // буфер передачи заполнен, прерываем отправку
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ïîëîæèòü ñèìâîë â áóôåð
|
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
|
||||||
void USART_PutChar(unsigned char sym) {
|
}
|
||||||
if (((UCSR0A & (1 << UDRE0)) != 0) && (txCount == 0)) {
|
//положить символ в буфер
|
||||||
|
void USART_put_char(unsigned char sym) {
|
||||||
|
if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) {
|
||||||
UDR0 = sym;
|
UDR0 = sym;
|
||||||
} else {
|
} else {
|
||||||
if (txCount < SIZE_BUF) {
|
if (!buffer_full(&usartTxBuffer)) {
|
||||||
usartTxBuf[txBufTail] = sym;
|
write_buffer(&usartTxBuffer, sym);
|
||||||
txCount++;
|
} else {
|
||||||
txBufTail++;
|
// Буфер передачи полон, обработка ошибки или другая логика
|
||||||
if (txBufTail == SIZE_BUF) {
|
|
||||||
txBufTail = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
//взять символ из буфера
|
||||||
//âçÿòü ñèìâîë èç áóôåðà
|
int get_char(unsigned char* sym) {
|
||||||
unsigned char GetChar(void) {
|
if (!buffer_empty(&usartTxBuffer)) {
|
||||||
unsigned char sym = 0;
|
*sym = read_buffer(&usartTxBuffer);
|
||||||
if (txCount > 0) {
|
return 1; // Успешно прочитан символ из буфера передачи
|
||||||
sym = usartTxBuf[txBufHead];
|
} else {
|
||||||
txCount--;
|
return 0; // Буфер передачи пуст, возникла ошибка чтения
|
||||||
txBufHead++;
|
|
||||||
if (txBufHead == SIZE_BUF) {
|
|
||||||
txBufHead = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sym;
|
//функция загрузки строк
|
||||||
}
|
void USART_send_str(const unsigned char* data) {
|
||||||
//ôóíêöèÿ çàãðóçêè ñòðîê
|
|
||||||
void USART_SendStr(const unsigned char* data) {
|
|
||||||
while (*data) {
|
while (*data) {
|
||||||
USART_PutChar(*data++);
|
USART_put_char(*data++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ïîëó÷àåì äàííûå èç áóôåðà
|
|
||||||
void UARTReceive(uint8_t* data) {
|
uint32_t receivedByteCount = 0;
|
||||||
uint32_t timeout_ms_mb = 100;//timeout 100ms, â íàøåì ñëó÷àå, èíîãäà ïî 1 ñåê, è äàæå ïî 4-5 ñ, åñëè áàéò ïîâðåäèëñÿ è èäåò îêîëî 1-2ñåêóíä, òî øòîðà ìîæåò ñëîìàòüñÿ
|
//получаем данные из буфера
|
||||||
|
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 timeout_ms = 4;
|
||||||
uint32_t start_time = millis();//çàïîìèíàåì âðåìÿ íà÷àëà îæèäàíèÿ
|
uint32_t start_time = millis();
|
||||||
while (rxCount == 0) { //îæèäàíèå íàëè÷èÿ äàííûõ â áóôåðå ïðè¸ìà
|
while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой
|
||||||
if ((millis() - start_time) > timeout_ms_mb) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî
|
if ((millis() - start_time) > timeout_ms_mb) {
|
||||||
return 0; //âûõîäèì èç öèêëà
|
// Обработка ошибки или таймаута приема
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data[0] = usartRxBuf[rxBufHead];//ñ÷èòûâàíèå áàéòà èç áóôåðà
|
while(1)
|
||||||
rxCount--;
|
{
|
||||||
rxBufHead++;
|
|
||||||
if (rxBufHead == SIZE_BUF) {
|
while (!buffer_empty(&usartRxBuffer)) { //пока буффер не пустой
|
||||||
rxBufHead = 0;
|
int reader = read_buffer(&usartRxBuffer);//принимаем символ в переменную
|
||||||
|
if(byteCount<=length){
|
||||||
|
data[byteCount] = reader; //записываем в массив с индексом byteCount
|
||||||
}
|
}
|
||||||
start_time = millis();//îáíóëÿåì òàéìàóò, òàê êàê äàííûå íà÷àëè ïðèõîäèòü
|
else{
|
||||||
while (rxCount > 0) { //îæèäàíèå îêîí÷àíèÿ ïðè¸ìà äàííûõ
|
overflow=1;
|
||||||
if ((millis() - start_time) > timeout_ms) { //åñëè âðåìÿ îæèäàíèÿ èñòåêëî
|
|
||||||
break; //âûõîäèì èç öèêëà îæèäàíèÿ
|
|
||||||
}
|
}
|
||||||
|
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));
|
||||||
//for (int i = 0; i < 7; i++) {
|
//
|
||||||
//UARTSend(buff, sizeof(buff));
|
//uint8_t receivedData[BUFFER_SIZE];
|
||||||
//}
|
//UART_receive(receivedData,sizeof(receivedData));
|
||||||
|
//UART_send(receivedData, sizeof(receivedData));
|
||||||
uint8_t receivedData[SIZE_BUF];
|
|
||||||
UARTReceive(receivedData);
|
|
||||||
|
|
||||||
|
|
||||||
UARTSend(receivedData, sizeof(receivedData));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
//unsigned long currentTime = millis();
|
//unsigned long currentTime = millis();
|
||||||
// Äåëàéòå ÷òî-òî ñ òåêóùèì âðåìåíåì...
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
//прерывание по завершению приема
|
||||||
ISR(USART_RX_vect) {
|
ISR(USART_RX_vect) {
|
||||||
if (rxCount < SIZE_BUF) {
|
uint8_t data = UDR0; // прочитать символ из регистра UDR0
|
||||||
usartRxBuf[rxBufTail] = UDR0;
|
if (!buffer_full(&usartRxBuffer)) {
|
||||||
rxBufTail++;
|
write_buffer(&usartRxBuffer, data);// записываем принятый символ в буфер приема
|
||||||
if (rxBufTail == SIZE_BUF) {
|
|
||||||
rxBufTail = 0;
|
|
||||||
}
|
|
||||||
rxCount++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
////îáðàáîò÷èê ïðåðûâàíèÿ ïî çàâåðøåíèþ ïåðåäà÷è
|
//перезаписать чтоб освободитть байт, из udr0
|
||||||
//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, ãîâîðÿùèé î òîì, ÷òî ïðèåì çàâåðøåí
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user