TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: valdorre en 23 de Octubre de 2007, 22:24:43

Título: cambiar de char cbuff[] a un int16
Publicado por: valdorre en 23 de Octubre de 2007, 22:24:43
hola gente, a ver si alguien me puede dar una manito que estoy perdido...
quiero pasar el contenido de un char cbuff[3] donde cbuff[0] corresponde a "P" y los otros 3 a numeros que recibo del puerto serie a un int16.
espero haber sido explicito.

saludos de antemano

Osvaldo
Título: Re: cambiar de char cbuff[] a un int16
Publicado por: RedPic en 24 de Octubre de 2007, 01:47:13
¿En CCS C?

int16 MyInt16;

MyInt16 = Make16(cbuff[1],cbuff[2]);

Título: Re: cambiar de char cbuff[] a un int16
Publicado por: valdorre en 24 de Octubre de 2007, 09:00:12
hola redpic, gracias por responder, si es en ccs c.
voy a probar con esa funcion, estoy haciendo pruebas con su ejemplo "Procesador de comandos vía RS232 (con Buffer de recepción)" y se me complico la cosa para cargar una variable int16 desde la pc...

gracias totales...

Osvaldo
Título: Re: cambiar de char cbuff[] a un int16
Publicado por: RedPic en 24 de Octubre de 2007, 09:11:22
Ja, ja, ja  :D :D :D He reconocido el cbuff[], es un nombre que uso mucho al escribir mis programas, aunque últimamente estoy llamándola USART_buffer[], esto me va por modas.  :mrgreen:
Título: Re: cambiar de char cbuff[] a un int16
Publicado por: valdorre en 24 de Octubre de 2007, 09:17:42
lo que me sucede es lo sig. el valor original del int16 perimetro=0x011A, ingreso por ejemplo 12 por puerto serie y cuando hago
   perimetro = Make16(cbuff[1],cbuff[2]);
perimetro pasa a tener 0x3132 y no 0x0012 como yo quiero :x
lo que tengo es un problema de conversión, pero no se como hacerlo....

nuevamente gracias
Título: Re: cambiar de char cbuff[] a un int16
Publicado por: RedPic en 24 de Octubre de 2007, 09:25:56
Es que 31 y 32 son los códigos ASCII de los números 1 y 2 y tú estas procesando los ASCII no los enteros. Para sacar el entero debes hacer

int8 MyEntero = '0' - MyAscii;

Así si envías '1' (0 sea ASCII 31) la ecuación será iagual a  '0' (o sea ASCII 30) menos '1' (o sea ASCII 31) con lo que obtendrás 1.  :mrgreen:
Título: Re: cambiar de char cbuff[] a un int16
Publicado por: valdorre en 24 de Octubre de 2007, 23:52:18
hola, bueno lo solucione con tu funcion que pasa de ascii a int(hex) y quedo asi:
Código: [Seleccionar]
int16 perimetro;
int aschex2int(char d);
...
int aschex2int(char d){          // Convierte un caracter ascii hex a int

   int r=0;                       // Declaro e inicializo a cero el resultado
   if(isxdigit(d)){               // Si es un digito hexadecimal ...
      if(isdigit(d)){             // si es un digito decimal ...
         r=d-'0';                 // devuelvo su diferencia con el valor ascii del caracter "0"
      }
      if(isalpha(d)){             // si es alfanumerico ...
         d=toupper(d);            // lo paso a mayusculas y ...
         r=10+(d-'A');            // devuelvo 10 mas su diferencia con el valor ascii de la letra "A"
      }
   }
   return(r);
}

....
if((cbuff[0]=='E')&&(cbuff[1]=='P')){   // Comparo inicio del buffer con comando "EP"
int  plow, phigh;
// printf("P%4lu %lX\n\r",perimetro,perimetro);

phigh =(16*aschex2int(cbuff[2]));             // Convierto el dígito mas significativo
phigh+=(aschex2int(cbuff[3]));
plow=(16*aschex2int(cbuff[4]));             // Convierto el dígito mas significativo
plow+=(aschex2int(cbuff[5]));   
printf("var %X %X\r\n",phigh,plow);
perimetro=0;
perimetro=Make16(phigh,plow);
printf("P %4Lu %LX\n\r",perimetro,perimetro);
//   printf("Leyendo ... ");           // Aqui lo que deseemos hacer con comando "\r"
   }


saludos y gracias

Osvaldo