Ir ao conteúdo

Posts recomendados

Postado

Boa noite amigos,

 

estou com o um problema que ainda não descobri como resolver. O problema é este, tenho uma string (texto qualquer max. 10 caracteres alfanuméricos) e quero enviar via USART para um atmega328 programado em C para AVR e armazenar em um buffer essa string. Segue o codigo:

 

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>

#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

int cont = 0;

void USART_Init( unsigned int ubrr)
{
	
	/*Set baud rate */
	UBRR0H = (unsigned char)(ubrr>>8);
	UBRR0L = (unsigned char)ubrr;
	
	/*Enable receiver and transmitter */
	UCSR0B = (1<<RXEN0)|(1<<TXEN0);
	
	/* Set frame format: 8data, 1stop bit */
	UCSR0C = (3<<UCSZ00);
	
}

void USART_Transmit( unsigned char data )
{
	
	/* Wait for empty transmit buffer */
	while (!( UCSR0A & (1<<UDRE0)));
	
	/* Put data into buffer, sends the data */
	UDR0 = data;
	
}

void USART_putstring(char* StringPtr) 
{
	while (*StringPtr != 0x00) 
	{
		
		USART_Transmit(*StringPtr);
		StringPtr++;
		
	}
}

unsigned char USART_Receive( void )
{
	
	/* Wait for data to be received */
	while (!(UCSR0A & (1<<RXC0)));
	
	/* Get and return received data from buffer */
	return UDR0;
	
}


void config_uC(){

	DDRB |= (1<<PB5);
	PORTB &= ~(1<<PB5);
	
}


int main(void)
{
    
	config_uC();
	USART_Init(MYUBRR);
	
    while (1) 
    {
		
		USART_putstring("Ola Mundo!!!");
		USART_Transmit(0x3B);
		
		char buffer[10];
		sprintf(buffer,"%i",cont);
		
		USART_putstring(buffer);
		USART_Transmit(0x3B);
							
		//sprintf(buffer2,"%c",USART_Receive());
		//USART_putstring(buffer2);
		
		USART_Transmit(0x0A);
		USART_Transmit(0x0D);
		
		PORTB ^= (1<<PB5);
		_delay_ms(1000);
		
		cont++;
			
    }
	
}

Todas as funções implementadas funcionam, porém a USART_receive() recebe apenas um BYTE por execução da função. O que quero é armazenar esse BYTE em um "char buffer2[10]", para depois tratar a informação. Alguém sabe como fazer isso ou o caminho para conseguir.

Postado

Habilite a interrupção RX serial, e no Handler da interrupção armazene os bytes recebidos a cada interrupção. Algo do tipo:

unsigned char Indice=0;          // Variavel para armazer os dados recebidos
unsigned char Semaphore=0;       // Variável para indicar que os 10 bytes foram recebidos
unsigned char Buffer2[10];       // Buffer que possuirá os 10 bytes recebidos
  
void RXByteRecebido_InterruptHandler(void){
  Limpa o flag da interrupção;
  Buffer2[Indice] = UDR0;        // Armazena o byte que acabou de chegar na posicao indicada pelo indice
  Indice++;                      // Incrementa o indice para que o próximo byte recebido seja armazenado na proxima posição
  if(Indice == 9){               // Se já chegaram 10 bytes
    Indice = 0;                  // Zera o indice
    
    Semaphore = 1;               // e seta uma variavel para indicar que os dados foram recebidos
  }
}


Já no código principal:

:
:
while(1){
  :
  :
  if(semaphore){                 // Se os dados já foram recebidos
    semaphore = 0;
    tratar informação recebida;
  }
  :
  :
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...