TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cvargcal en 04 de Noviembre de 2018, 15:57:07

Título: Duda UART
Publicado por: cvargcal en 04 de Noviembre de 2018, 15:57:07
Saludos,
Tengo un lector RIDF que me entrega este dato

//!Numero tarteja: 0009531147
//!Dato          : 00 91 6f 0b f5
//!check bit, f5 = 00^91^6f^0b



Solo tengo que leer por uart y reenviarlo por BLE,   el problema que tengo es que ese modulo envia HEX y no ASCII.

Código: C
  1. c=getc(RFID);                          
  2. UID[i++]=c;
  3. Ahi tengo el dato  00 91 6f 0b f5
Si lo quiero imprimir en string,  no imprime el buffer  porque no es un asccii
Código: C
  1. for (k=0;k<5;k++) fprintf(debug,"%c",UID[k]);      //  imprime ruido, no identifica cada byte como caracter.
  2.  
  3. si uso esto :
  4.  
  5. for (k=0;k<5;k++) fprintf(debug,"%X",UID[k]);      // IUD      imprime 00916f0bf5

La pregunta es, porque el dato de entrada no es un simple ascii?
necesito imprimir ese buffer como un ascii, o mejor dicho, necesito identificar cada "dígito" como un accii para usar una función que convierte asccii a pulsaciones de teclado USB.

Tengo que separar el Hex 0x00 en dos numero 0x0 y 0x0  para poder usar esta función:


// ******* ASCCI to KEYBOARD
uint16_t ToHidKeyboardScancode(char c){
      switch(c){
      // Hex
         case 'A':   return(0x04);
         case 'B':   return(0x05);
         case 'C':   return(0x06);
         case 'D':   return(0x07);
         case 'E':   return(0x08);
         case 'F':   return(0x09);

         case '1':   return(0x1E);
         case '2':   return(0x1F);
         case '3':   return(0x20);
         case '4':   return(0x21);
         case '5':   return(0x22);  //
         case '6':   return(0x23);  //
         case '7':   return(0x24);  //
         case '8':   return(0x25);  //
         case '9':   return(0x26);  //
         case '0':   return(0x27);
      }
      //if ((c>='a') && (c<='z')) return (c-'a'+'A');
      return(0);

}
Título: Re:Duda UART
Publicado por: cvargcal en 06 de Noviembre de 2018, 02:53:51
Me respondo... en CCS me dieron la respuesta.

Código: C
  1. #include <18F46K22.h>
  2. #fuses INTRC_IO, NOWDT
  3. #use delay(clock=4M)
  4. #use rs232(UART1, baud=9600, ERRORS)
  5.  
  6. #define TO_HEX(i) ((i) <= 9 ? ('0' + (i)) : ('A' - 10 + (i)))
  7.  
  8. //=======================================
  9. void main()
  10. {
  11. int8 k;
  12. int8 UID[5]= {0x00, 0x91, 0x6f, 0x0b, 0xf5};
  13.  
  14. for(k=0;k<5;k++)
  15.    {
  16.     putc(TO_HEX(UID[k] >> 4));    
  17.     putc(TO_HEX(UID[k] & 0x0F));    
  18.    }
  19.  
  20. while(TRUE);
  21. }

Salida: 0 0 9 1 6 f 0 b f 5   como caracter.