Modbus_master_2/UART/main.c

128 lines
3.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <string.h>
#include "timer.h"
#include "circular_buf.h"
#define F_CPU 16000000
struct circular_buffer usartTxBuffer;
struct circular_buffer usartRxBuffer;
void UART_init(void) {
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (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(&usartTxBuffer)) {
write_buffer(&usartTxBuffer, data[i]);
} else {
break; // буфер передачи заполнен, прерываем отправку
}
}
UCSR0B |= (1 << UDRIE0); // Включаем прерывание по опустошению буфера передачи
}
//положить символ в буфер
void USART_put_char(unsigned char sym) {
if (((UCSR0A & (1 << UDRE0)) != 0) && buffer_empty(&usartTxBuffer)) {
UDR0 = sym;
} else {
if (!buffer_full(&usartTxBuffer)) {
write_buffer(&usartTxBuffer, sym);
} else {
// Буфер передачи полон, обработка ошибки или другая логика
}
}
}
//взять символ из буфера
int get_char(unsigned char* sym) {
if (!buffer_empty(&usartTxBuffer)) {
*sym = read_buffer(&usartTxBuffer);
return 1; // Успешно прочитан символ из буфера передачи
} else {
return 0; // Буфер передачи пуст, возникла ошибка чтения
}
}
//функция загрузки строк
void USART_send_str(const unsigned char* data) {
while (*data) {
USART_put_char(*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 = 4;
uint32_t start_time = millis();
while (buffer_empty(&usartRxBuffer)) {// пока буфер пустой
if ((millis() - start_time) > timeout_ms_mb) {
// Обработка ошибки или таймаута приема
return -1;
}
}
while(1)
{
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;
}
}
return overflow?-1:byteCount;
}
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) {
if (!buffer_full(&usartRxBuffer)) {
write_buffer(&usartRxBuffer, UDR0);// Записываем принятый символ в буфер приема
}
else { // Буфер приема заполнен, сохраняем принятые символы в другую переменную
uint8_t overflow_data = UDR0; // Прочитать символ из регистра UDR0
// Дальнейшая обработка данных в overflowData
}
}
//перезаписать чтоб освободитть байт, из udr0