Enviando enteros a través del USART de PIC

3

Necesito enviar números enteros desde la placa de mi microcontrolador ( PIC16F877 ) a la PC. Estoy usando MAX232 para esto. Necesito usar un código similar a este (codificado utilizando mikroc 8.2) .

Tenga en cuenta que esto no es correcto (en realidad, la línea Usart_Write(count); no funcionará como pretende ). Pero mostrará lo que estoy tratando de hacer.

#define BAUD_RATE 57600
#define DELAY 500
int count;

void interrupt(){
     if(INTCON.INTF == 1 ){
          count++;
          INTCON.INTF = 0;
     }
}

void setup(){
     INTCON = 0x90;
     TRISB = 0x01;
     Usart_Init(BAUD_RATE);
     count = 0;
}

void main() {
     setup();
     while(1){
        Usart_Write('>');
        Usart_Write(count);
        Usart_Write('<');
        count = 0;
        delay_ms(DELAY);
     }
}

La aplicación es simple. La variable counter se incrementa con PORTB0 interrupt y el valor counter se necesita para enviar a PC .

¿Puede alguien mostrarme una forma correcta (y simple) de hacer esto?

    
pregunta Anubis

3 respuestas

3

Según tengo entendido, su problema es cómo imprimir una secuencia de caracteres ASCII que representan un número entero.

Ya tienes una función que puede imprimir un char, así que quieres algo como lo siguiente:

char buf[16];
char *p;

sprintf(buf, "%d", count);
p = buf;
while(*p)
    Usart_Write(*p++);

Si no tiene sprintf() en su biblioteca de C, intente itoa() .

(Nota para los pedantes, snprintf() es más seguro, pero no se admite universalmente)

    
respondido por el Toby Jaffey
1

Siempre que necesite verificar si algo está funcionando o no, intente enfocarse en sus partes específicas. Como en este código, no perderá un mayor valor de conteo: -

void main() {
     setup();
     while(1){
        if(count)
        {
            Usart_Write('>');
            Usart_Write(count); //Your syntax is correct
            Usart_Write('<');
            count = 0;
        }
        delay_ms(DELAY);
     }
}
    
respondido por el perilbrain
1

¿Por qué no envías bytes de entero?

char *p =(char*)&count;

send(*p);p++;
send(*p);p++;
send(*p);p++;
send(*p);

y en el otro lado puede recopilar bytes y formar un entero, esto es probablemente más rápido que la conversión a la matriz char.

Saludos, Luka

    
respondido por el Luka Pivk

Lea otras preguntas en las etiquetas