Изменил(а) на 'UART/main.c'
This commit is contained in:
parent
cac4258352
commit
2739418e23
121
UART/main.c
121
UART/main.c
@ -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); // включаем прерывание по приему и опустошению буфера передачи
|
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; // буфер передачи заполнен, прерываем отправку
|
break; // буфер передачи заполнен, прерываем отправку
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
|
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
|
||||||
}
|
}
|
||||||
//положить символ в буфер
|
//положить символ в буфер
|
||||||
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 {
|
||||||
// Буфер передачи полон, обработка ошибки или другая логика
|
// Буфер передачи полон, обработка ошибки или другая логика
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//взять символ из буфера
|
//взять символ из буфера
|
||||||
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; // Успешно прочитан символ из буфера передачи
|
return 1; // Успешно прочитан символ из буфера передачи
|
||||||
} else {
|
} else {
|
||||||
return 0; // Буфер передачи пуст, возникла ошибка чтения
|
return 0; // Буфер передачи пуст, возникла ошибка чтения
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//функция загрузки строк
|
//функция загрузки строк
|
||||||
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++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//получаем данные из буфера
|
|
||||||
void UARTReceive(uint8_t* data) {
|
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_mb = 100;
|
||||||
uint32_t timeout_ms = 4;
|
uint32_t timeout_ms = 4;
|
||||||
uint32_t start_time = millis();
|
uint32_t start_time = millis();
|
||||||
while (BufferEmpty(&usartRxBuffer)) {
|
while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой
|
||||||
if ((millis() - start_time) > timeout_ms_mb) {
|
if ((millis() - start_time) > timeout_ms_mb) {
|
||||||
// Обработка ошибки или таймаута приема
|
// Обработка ошибки или таймаута приема
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data[0] = readBuffer(&usartRxBuffer);
|
while(1)
|
||||||
start_time = millis();
|
{
|
||||||
while (!BufferEmpty(&usartRxBuffer)) {
|
|
||||||
if ((millis() - start_time) > timeout_ms) {
|
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;
|
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);// Записываем принятый символ в буфер приема
|
write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!BufferEmpty(&usartTxBuffer)) {
|
else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную
|
||||||
UDR0 = readBuffer(&usartTxBuffer);// Отправляем символ из буфера передачи
|
|
||||||
} else {
|
uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0
|
||||||
UCSR0B &= ~(1 << UDRIE0); // Отключаем прерывание по опустошению буфера передачи
|
// Дальнейшая обработка данных в overflowData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//перезаписать чтоб освободитть байт, из udr0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user