Estimados, buenas noches!
Estoy intentando recibir una cadena de caracteres por medio del modulo USART de un ATMEGA328 utilizando el ide de Atmel Studio en C. El problema es que la funcion que hice para recolectar cada caracter recibido no estaria funcionando como corresponde o quizas yo estoy implementando algo mal, pero las demas funciones se encuentran bien dado que hice una prueba con un circuito hecho en mi protoboard enviando solo un caracter y otra prueba enviando una cadena de caracteres desde el micro transmisor al micro receptor, el mismo recibe los caracteres pero no me recibe la cadena.
Debajo adjunto los codigos tanto del tx como del rx para que alguno de ustedes que sea mas experimentado que yo me pueda ayudar con el error!
La funcion que estoy intentando implementar para recibir las cadenas no la he dimensionado por si recibe mas de "x" caracteres en una cadena, porque solo por el momento estoy intentando que al menos pueda recibirlas. La funcion es la siguiente:
El codigo del tx.c
El codigo del rx.c
Desde ya, muchisimas gracias y un saludo a todos!
Estoy intentando recibir una cadena de caracteres por medio del modulo USART de un ATMEGA328 utilizando el ide de Atmel Studio en C. El problema es que la funcion que hice para recolectar cada caracter recibido no estaria funcionando como corresponde o quizas yo estoy implementando algo mal, pero las demas funciones se encuentran bien dado que hice una prueba con un circuito hecho en mi protoboard enviando solo un caracter y otra prueba enviando una cadena de caracteres desde el micro transmisor al micro receptor, el mismo recibe los caracteres pero no me recibe la cadena.
Debajo adjunto los codigos tanto del tx como del rx para que alguno de ustedes que sea mas experimentado que yo me pueda ayudar con el error!
La funcion que estoy intentando implementar para recibir las cadenas no la he dimensionado por si recibe mas de "x" caracteres en una cadena, porque solo por el momento estoy intentando que al menos pueda recibirlas. La funcion es la siguiente:
Código:
char * usart_recibirCadena(void)
{
int longitud = 0;
static char cadena[10];
for (longitud = 0; longitud < 10; longitud++)
{
cadena[longitud] = usart_recibirDato();
}
return cadena;
}
El codigo del tx.c
Código:
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
void usart_configurar(int baud);
void usart_enviarDato(char dato);
void usart_enviarCadena(char cadena[]);
int main(void)
{
usart_configurar(9600);
while (1)
{
usart_enviarCadena("on");
_delay_ms(1000);
usart_enviarCadena("off");
_delay_ms(1000);
}
return 0;
}
void usart_configurar(int baud)
{
uint8_t ubrr = ((F_CPU/(16*baud))-1);
UBRR0 = ubrr;
UCSR0B |= (1<<TXEN0);
UCSR0C &= ~((1<<UMSEL01)|(1<<UMSEL00));
UCSR0C &= ~((1<<UPM01)|(1<<UPM00));
UCSR0C &= ~(1<<USBS0);
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
}
void usart_enviarDato(char dato)
{
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = dato;
}
void usart_enviarCadena(char cadena[])
{
int longitud = 0;
while (cadena[longitud] != 0x00)
{
usart_enviarDato(cadena[longitud]);
longitud++;
}
}
El codigo del rx.c
Código:
#define F_CPU 8000000
#include <avr/io.h>
#include <string.h>
char datoSerial[10];
char encender[] = "on";
char apagar[] = "off";
void usart_configurar(int baud);
char usart_recibirDato(void);
char * usart_recibirCadena(void);
int main(void)
{
usart_configurar(9600);
DDRB |= (1<<0);
while (1)
{
strcpy(datoSerial, usart_recibirCadena());
if (datoSerial == encender)
{
PORTB |= (1<<0);
}
if (datoSerial == apagar)
{
PORTB &= ~(1<<0);
}
}
return 0;
}
void usart_configurar(int baud)
{
uint8_t ubrr = ((F_CPU/(16*baud))-1);
UBRR0 = ubrr;
UCSR0B |= (1<<RXEN0);
UCSR0C &= ~((1<<UMSEL01)|(1<<UMSEL00));
UCSR0C &= ~((1<<UPM01)|(1<<UPM00));
UCSR0C &= ~(1<<USBS0);
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
}
char usart_recibirDato(void)
{
while (!(UCSR0A & (1<<RXC0)));
return(UDR0);
}
char * usart_recibirCadena(void)
{
int longitud = 0;
static char cadena[10];
for (longitud = 0; longitud < 10; longitud++)
{
cadena[longitud] = usart_recibirDato();
}
return cadena;
}
Desde ya, muchisimas gracias y un saludo a todos!