Ir ao conteúdo
  • Cadastre-se

Outro Armazenar uma string enviada pela serial em um buffer


Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

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;
  }
  :
  :
}

 

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!