Cómo enviar una cadena en comunicación serie en AVR-C

2

Entonces, 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 traté de hacer fue que intenté colocar la entrada del usuario en una matriz y transmitir cada elemento de esa matriz. Sin embargo, solo pude obtener las primeras letras para transmitir no toda la matriz, aquí está mi código:

//tx serial
#include <avr/io.h> 

#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);  //8 bit data format
    ////////////////////////////////////////////////////////////////
    int i = 0;

    while (1){  

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

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

    
pregunta Redrachet2

3 respuestas

6

No estoy seguro, solo una suposición rápida. Tal vez deberías poner el while(UDRE0 == 0){} entre los caracteres de envío. Creo que es esperar hasta que un personaje haya sido enviado.

for (i = 0; i < strlen(ar); i++){ 
   while (( UCSR0A & (1<<UDRE0))  == 0){};
   UDR0 = ar[i]; 
}
    
respondido por el Paul
1

Así que probé tu código y funciona !! Sin embargo, cuando lo hice, como esperaba, siguió imprimiendo hola continuamente, pero hice que volviera a cero para que se imprimiera hola una vez que 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;
                            }
                        } 
                }

            }   

Me gustaría señalar que hay algunas variables aleatorias y cosas definidas que ni siquiera uso, simplemente ignorarlas

    
respondido por el Redrachet2
0

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

El código Setup se ejecuta solo una vez, al inicio de su programa. Excelente para inicializar cualquier periférico y / o enviar una rutina de inicio / mensaje de saludo. El código Loop se ejecuta continuamente, por lo general, este contiene un programa como leds parpadeantes ... o el sistema de seguridad de una central nuclear. Sin embargo, no está diseñado para ser devuelto, está diseñado para funcionar para siempre. Aunque mi código te atrape en un tiempo (para siempre); si tuvieras que volver de allí.

No he probado el código, estoy en .. "work" .. oops. - (En realidad soy un estudiante en prácticas, antes de que alguien comience a odiar, esto tiene un valor educativo).

#include <avr/io.h> 
#define F_CPU 16000000 
#define BUAD 9600 
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)  

//Function definitions
void Setup(void);
void Loop(void);
void serialSetup(void);
void serialSend(char* sendString);

//Global variables.
char ar[]= "hello";

void Setup(){
//Code to be run once (At start).
    serialSetup();
    serialSend(ar);
}

void Loop(){
    //Code to be run continiously.
}

void serialSetup(){
    //Register settings
    //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
}

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

int main(void){  
    Setup();
    while(1){
       Loop();
    }
while(1){}//If you ever return from Loop(); This while will catch you, so it won't continue doing randomness.           
}  
    
respondido por el Paul

Lea otras preguntas en las etiquetas