Autor Tema: cambiar de char cbuff[] a un int16  (Leído 1741 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 348
cambiar de char cbuff[] a un int16
« 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
« Última modificación: 23 de Octubre de 2007, 22:29:50 por valdorre »
Osvaldo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: cambiar de char cbuff[] a un int16
« Respuesta #1 en: 24 de Octubre de 2007, 01:47:13 »
¿En CCS C?

int16 MyInt16;

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

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 348
Re: cambiar de char cbuff[] a un int16
« Respuesta #2 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
Osvaldo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: cambiar de char cbuff[] a un int16
« Respuesta #3 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:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 348
Re: cambiar de char cbuff[] a un int16
« Respuesta #4 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
Osvaldo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: cambiar de char cbuff[] a un int16
« Respuesta #5 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:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado valdorre

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 348
Re: cambiar de char cbuff[] a un int16
« Respuesta #6 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
Osvaldo


 

anything