4 votos

Cómo enviar cadenas en comunicación serial en AVR-C

Tal como indica el título, en lugar de enviar un byte de información a la vez, me gustaría poder enviar una cadena completa. Lo que intenté hacer fue poner la entrada del usuario en un array y transmitir cada elemento de ese array. Sin embargo, solo pude lograr que se transmitieran las primeras letras y no toda la cadena. Aquí está mi código:

//tx serial
#include  

#define F_CPU 16000000 
#define BUAD 9600 
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)  

int main(void){  

    char ar[]= "hello";

    //High and low bits
    UBRR0H = (BUAD_RATE_CALC >> 8); 
    UBRR0L = BUAD_RATE_CALC; 
    //////////////// 
    //transimit and recieve enable
    UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0); 
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);  //formato de datos de 8 bits
    ////////////////////////////////////////////////////////////////
    int i = 0;

    while (1){  
        while (( UCSR0A & (1<

`

¿Cuál crees que podría ser el problema con esto?

`

8voto

tillz Puntos 126

No estoy muy seguro, solo una suposición rápida. Tal vez debas poner while(UDRE0 == 0){} entre el envío de caracteres. Creo que es para esperar hasta que se haya enviado un carácter.

for (i = 0; i < strlen(ar); i++){ 
   while (( UCSR0A & (1<

1voto

Ganesh Shankar Puntos 164

¡Así que probé tu código y funciona! Sin embargo, como era de esperar, seguía imprimiendo continuamente "hello", pero hice que devolviera cero para que lo imprima solo una vez, aquí está el código:

//data_buffer 

//tx serial

#include <avr/io.h> 

#define F_CPU 16000000 
#define BUAD 9600 
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)  
#define buffer_size 128
#define boolen 0
int main(void){  
    char br;
    char ar[]= "hello";
    char buffer[10]; 
    //High and low bits
    UBRR0H = (BUAD_RATE_CALC >> 8); 
    UBRR0L = BUAD_RATE_CALC; 
    //////////////// 
    //transimit and recieve enable
    UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0); 
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);  //8 bit data format
    ////////////////////////////////////////////////////////////////
    int i = 0;

    while (1){  
    /*while( (UCSR0A & (1<<RXC0))  == 0 ){}; 
        br = UDR0;
    */

    while (( UCSR0A & (1<<UDRE0))  == 0){};

            for (i = 0; i < strlen(ar); i++){ 
                while (( UCSR0A & (1<<UDRE0))  == 0){};
                UDR0 = ar[i]; 
                if (i == (strlen(ar) - 1)){ 
                    return 0;
                }
            } 
    }
}   

Quiero hacer notar que hay algunas variables y cosas definidas al azar que ni siquiera uso, simplemente ignóralas

0voto

tillz Puntos 126

Debes hacer una nueva pregunta para cada otra pregunta que tengas... Pero bueno. El código a continuación (Puede parecer un poco estilo arduino, pero podría ayudar al que pregunta).

El código de Setup se ejecuta solo una vez, al principio de tu programa. Ideal para inicializar cualquier periférico y/o enviar un mensaje de saludo / rutina de inicio. El código de Loop se ejecuta continuamente, generalmente contiene un programa como el parpadeo de leds... o el sistema de seguridad de una central nuclear. Sin embargo, no está diseñado para retornar, está diseñado para ejecutarse siempre. Aunque mi código te atrapará en un while(forever); si intentas retornar de él.

No he probado el código, pero supongo que sería algo así:

#include 
#define F_CPU 16000000
#define BUAD 9600
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)

//Definiciones de funciones
void Setup(void);
void Loop(void);
void serialSetup(void);
void serialSend(char* sendString);

//Variables globales
char ar[]= "hello";

void Setup(){
//Código a ejecutar una vez (Al inicio).
    serialSetup();
    serialSend(ar);
}

void Loop(){
    //Código a ejecutar continuamente.
}

void serialSetup(){
    //Ajustes de registros
    //Bits altos y bajos
    UBRR0H = (BUAD_RATE_CALC >> 8);
    UBRR0L = BUAD_RATE_CALC;
    //Habilitar transmisión y recepción
    UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0);
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);  //Formato de datos de 8 bits
}

void serialSend(char* sendString){
     for (int i = 0; i < strlen(sendString); i++){ 
         while (( UCSR0A & (1<

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X