Autor Tema: Convertir variables char a int16  (Leído 5296 veces)

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

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Convertir variables char a int16
« en: 18 de Abril de 2014, 21:28:32 »
Hola muy buen dia, he estado probando un codigo que realmente no me sale, estoy intentando transformar una variable string (ejemplo char valor[5];) a una variable entera tipo int16 duty, se que la funcion es duty=atol(valor); pero no me sale nada. Ayuda porfavor se los agradecere  :-/  :-/ , os dejo el codigo:

#include <18f4550.h>
#fuses INTRC,PUT,BROWNOUT
#use delay(INTERNAL=4M)
#use RS232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N,BITS=8)
#include <lcd.c>
#include <stdlib.h>
char valor[9];
int16 duty;

#INT_RDA
void serial_isr()
{
   fgets(valor);
   delay_ms(50);
   puts(valor);
   
   duty = atol(valor);
   printf(lcd_putc,"%Lu",duty);
}


void main()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   set_tris_c(0x00);
   
   //CONFIGURACION PARA EL PWM, FRECUENCIA DE MOTOR A 1 KHz
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
   
   //INICIAR PRESENTACION
   lcd_init();
   lcd_gotoxy(3,1);
   printf(lcd_putc,"PIC18F4550");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"PWM: PIC_LabVIEW");
   delay_ms(2000);
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"VALOR DEL DUTY:");
   lcd_gotoxy(1,2);

   while(TRUE)
   {
   }
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #1 en: 18 de Abril de 2014, 21:37:43 »
  No estoy familiarizado con CCS, por lo cual tal vez esté equivocado en algunos puntos.

  Imagino que la función fgets, te devolverá un string terminado en el decimal (13) -que, creo, es el caracter de retorno de carro-.

  Ahora bien, por lo poco que la he utilizado, la función atoi o atol necesita una variable string terminada en 0 -caracter nulo- y tal vez allí es donde esté el error.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Convertir variables char a int16
« Respuesta #2 en: 18 de Abril de 2014, 21:40:04 »
es atoi no atol, la 2ª es para long, prueba a ver si te va

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #3 en: 18 de Abril de 2014, 21:48:22 »
Pues no MerLiNz le puse atoi pero no me sale nada jeje. Mmm el valor que recibo desde la PC al PIC va de 0 a 1024, por lo que supongo yo es string en este caso valor, cambiaria a char valor[5]; ? jeje debido a que solo recibo caracteres de hasta 4 digitos y creo que el ultimo se completa con un caracter "NULL", aun asi no funciona jeje rayos  :5]

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #4 en: 18 de Abril de 2014, 21:54:21 »
  Para ir descartando posibles problemas, yo crearía una variable char pero ya asignándole un valor e intentaría emplear atoi o atol en dicha variable en lugar de aplicarla a algo recibido desde el UART.

Código: C
  1. char palabra[10] = "1256";

 por ejemplo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #5 en: 18 de Abril de 2014, 22:09:55 »
Muy bien AngelGris probe como me dijiste:

char valor[10]= "1024";
int16 duty;

despues viene la conversión:

duty=atol(valor);
printf(lcd_putc,"%Lu",duty);

En la pantalla display 16x2 me sale el valor convertido a una int16 solo me funciona con atol, probe con atoi y me salian puros ceros.
Por el momento se que atol funciona para int16, ahora como lo convierto y recibo ya con la UART


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #6 en: 18 de Abril de 2014, 22:15:23 »
Muy bien AngelGris probe como me dijiste:

char valor[10]= "1024";
int16 duty;

despues viene la conversión:

duty=atol(valor);
printf(lcd_putc,"%Lu",duty);

En la pantalla display 16x2 me sale el valor convertido a una int16 solo me funciona con atol, probe con atoi y me salian puros ceros.
Por el momento se que atol funciona para int16, ahora como lo convierto y recibo ya con la UART



  Para mí el problema viene por lo que te comenté en la primer respuesta. fgets termina el string con un caracter distinto de 0 y por ello genera los inconvenientes.

  Si como indicas, sólo recibes datos de hasta 4 dígitos, puedes intentar lo siguiente antes de la conversión

Código: C
  1. valor[4] = 0;

  con ello eliminarías el caracter de retorno de carro y colocarías el caracter nulo. Para que la función atol no genere inconvenientes.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #7 en: 18 de Abril de 2014, 22:32:38 »
Mu bien, pues lo intente AngelGris, si recibo un numero string de 4 digitos mas un retorno de carro en total serian 5 espacios osea char valor[5]; al compilarlo me salia error, puesto que no podia insertar un valor cualsea en esa posicion del arreglo osea valor[5]=0; sigo sin llegar a algun exito. Siento que quizas deberia probar alguna logica diferente o cambiar la funcion fgets(valor) por alguna otra  :(

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #8 en: 18 de Abril de 2014, 22:49:22 »
  Si tu defines de la siguiente forma

Código: C
  1. char valor[9];

indicas que valor tiene 9 espacios, pero el índice va desde 0 a 8. Por ello el quinto caracter va a tener como índice el número 4.

  No cambies tu definición de la variable, simplemente intenta escribir en el índice número 4 de la misma. Tal vez CCS no te permita hacerlo, no lo sé.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #9 en: 19 de Abril de 2014, 11:18:06 »
Bien, pues buscando y hallando otras maneras para resolver este problema, en alguna página y en algún codigo encontre que para trasformarla simplemente hacia una operacion de una variable tipo char y una entera, ¿Quien sabe porque?, simplemente no lo sé, solo se que funciona, pueden probarlo. Mas o menos quedaría así:

char valor;
int16 duty;

#INT_RDA
void serial_isr()
{
   valor=getchar();
   delay_ms(50);
   duty=(valor-48);

   printf(lcd_putc,"%Lu",duty);

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #10 en: 19 de Abril de 2014, 11:32:40 »
Yo lo haria usando casting   :mrgreen:
Asi:

Citar
char caract = 'Z';
   int16 Num;
  
   Num = (int16)caract;
   printf("%lu ",Num);

Nota:
 El caracter 'Z' es igual a 90 (en decimal)

Saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #11 en: 19 de Abril de 2014, 12:02:08 »
Bien, pues buscando y hallando otras maneras para resolver este problema, en alguna página y en algún codigo encontre que para trasformarla simplemente hacia una operacion de una variable tipo char y una entera, ¿Quien sabe porque?, simplemente no lo sé, solo se que funciona, pueden probarlo. Mas o menos quedaría así:

char valor;
int16 duty;

#INT_RDA
void serial_isr()
{
   valor=getchar();
   delay_ms(50);
   duty=(valor-48);

   printf(lcd_putc,"%Lu",duty);

  En este caso simplemente conviertes 1 dígito , no 4 dígitos como tú necesitas. Y funciona por como es el código ascii.

código ascii                   número

48                                    0
49                                    1
50                                    2

y así sucesivamente. Por lo tanto si le restas 48 al valor del código ascii obtienes el valor decimal que te interesa.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Convertir variables char a int16
« Respuesta #12 en: 19 de Abril de 2014, 12:26:50 »
Asi mismo Angelgris, solo que el necesita, segun el codigo que coloco mas arriba, el resultado en un long asi que usando el casting mata dos pajaros de un solo tiro   :D

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Convertir variables char a int16
« Respuesta #13 en: 19 de Abril de 2014, 12:45:31 »
Asi mismo Angelgris, solo que el necesita, segun el codigo que coloco mas arriba, el resultado en un long asi que usando el casting mata dos pajaros de un solo tiro   :D

  Si claro, mi respuesta fue porque a él parecía asombrarle que funcione el último código que mostró.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PabloPic

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir variables char a int16
« Respuesta #14 en: 19 de Abril de 2014, 12:52:55 »
Lo que no entiendo es que segun RALF2, emplenado casting quedaria de esta manera:

char valor;
int16 duty;

#INT_RDA
void serial_isr()
{
   valor=getchar();
   duty=(int16)valor;
   printf("%Lu,valor);
}

Pero no me funciona, o ¿Esta mal el codigo?