TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
¿En CCS C?
int16 MyInt16;
MyInt16 = Make16(cbuff[1],cbuff[2]);
-
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
-
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:
-
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
-
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:
-
hola, bueno lo solucione con tu funcion que pasa de ascii a int(hex) y quedo asi:
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