Autor Tema: Convertir caracter en valor numerico en CCS  (Leído 13467 veces)

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

Desconectado velascoluis75

  • PIC10
  • *
  • Mensajes: 15
Convertir caracter en valor numerico en CCS
« en: 05 de Noviembre de 2010, 14:21:46 »
Hola amigos, saludos y gracias anticipadas por vuestra atención
Como veo que no encuentro la solución, después de probar todo lo que se me ha cocurrido, os describo
el problema.  Envío desde  un programa en Visual Basic 6, una variable numérica (numero) por medio de un puerto COM virtual hasta un PIC 18f4550 que corre bajo un programa compilado en CCS;  como la función puerto.Output no admite variables numéricas, convierto previamente la variable a Str y envio puerto.output=Str(numero). Hasta aquí sin problemas.

Leo lo que llega al PIC mediante  usb_get_packet(1, az, 5);
He definido previamente int8 az[5] porque el número que llega siempre tiene 5 cifras
Depués intento convertir la cadena de caracteres en su valor numerico mediante
valor=atol(az);   Sin embargo, cuando visualizo valor en LCD siempre está a cero. Definí también
int long valor.
Algo se me pasa y por más que lo pienso no lo veo.  Gracias

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Convertir caracter en valor numerico en CCS
« Respuesta #1 en: 05 de Noviembre de 2010, 18:14:28 »
Hola, lo más fácil que puedes hacer es enviar, desde VB6, el número en código ASCII o en Hexagecimal. Pero si de todos modos quieres pasar el numero cifra por cifra, la forma de hacerlo sería mas o menos así:

Código: [Seleccionar]
   Valor=(az[0]-'0')*10000;
   Valor+=(az[1]-'0')*1000;
   Valor+=(az[2]-'0')*100;
   Valor+=(az[3]-'0')*10;
   Valor+=az[4]-'0';

Obviamente podrías hacer un blucle for.

saludos.

Desconectado velascoluis75

  • PIC10
  • *
  • Mensajes: 15
Re: Convertir caracter en valor numerico en CCS
« Respuesta #2 en: 06 de Noviembre de 2010, 09:04:58 »
Muchas gracias por la respuesta, amigo, muy amable.

Ya he encontrado el problema, lo que pasaba es que no añadía al final de la cadena de caracteres un caracter nulo y eso es lo que necesita la función atoi() para convertir caracteres--->número
A veces, se nos pasa por alto lo evidente. Lo he arreglado así:
azmr=0;
altr=0;
az[5]=0x00; //añadir caracter nulo al final de la cadena para atol()
at[5]=0x00;
azmr=atol(az);
altr=atol(at);

Un saludo

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Convertir caracter en valor numerico en CCS
« Respuesta #3 en: 19 de Mayo de 2011, 18:15:51 »
Disculpen, estoy intentando hacer algo parecido y no se como....
no puedes publicar el codigo para verlo mejor???
Muchas gracias

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Convertir caracter en valor numerico en CCS
« Respuesta #4 en: 19 de Mayo de 2011, 21:36:20 »
Hallado en el help del CCS:

atoi( )
atol( )
atoi32( )

--------------------------------------------------------------------------------

Syntax:
ivalue = atoi(string)
   or
lvalue = atol(string)
   or
i32value = atoi32(string)

Parameters: string is a pointer to a null terminated string of characters.

Returns:
ivalue is an 8 bit int.
lvalue is a 16 bit int.
i32value is a 32 bit int.

Function:  Converts the string passed to the function into an  int representation.  Accepts both decimal and hexadecimal argument.  If the result cannot be represented, the behavior is undefined.
 
Availability: All devices
 
Requires: #include <stdlib.h>

Examples:

char string[10];

int x;
strcpy(string,"123");

x = atoi(string);

// x is now 123
 

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Convertir caracter en valor numerico en CCS
« Respuesta #5 en: 19 de Mayo de 2011, 23:13:53 »
Si eso lo vi KALLITOS, muchas gracias igual.
Les digo mas especificamente cual es mi problema, yo quiero tomar un dato que me llegue de la pc (en varios bytes) y guardarlo en el pic a traves de USB

Pues bien, pense que para esto lo mejor es usar las funciones usb_gets(); o usb_get_packet();
Pero no me anda ninguna de las dos  :(

las ejecuto asi:
usb_gets(1, string, 64, 10);
usb_get_packet(1, string, 64);

y la envio devuelta a la pc de la forma
printf (usb_cdc_putc, "El string es: %c\n\r", string); 

Y la PC solo me muestra "El string es:" por cada caracter que le llega y nada mas.....

Y bueno luego de eso convertir ese string en numeros para hacer cuentas, pero creo que todavia no llegue a recibirlo.

No se si se entiende lo que quiero?
Si quieren subo el codigo en el cual estoy trabajando

Gracias por su ayuda


Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Convertir caracter en valor numerico en CCS
« Respuesta #6 en: 20 de Mayo de 2011, 11:37:04 »
De lo poco que he usado USB esta esto:


      if(usb_cdc_kbhit())
         {
         recep_pc = usb_cdc_getc();
         printf(usb_cdc_putc,"%c",recep_pc);
         }

Aunque, en el foro hay bastante de usb, creo que mejor abres otro hilo especificamente con usb.

saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Convertir caracter en valor numerico en CCS
« Respuesta #7 en: 20 de Mayo de 2011, 17:07:53 »
Si eso tambien lo probe y solo me envia de a un caracter, yo quiero que me reciba varios hasta encotrar un ACII13 (enter) y luego envie todos juntos....

Pronto abrire un hilo nuevo, gracias por tu ayuda de todas formas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Convertir caracter en valor numerico en CCS
« Respuesta #8 en: 20 de Mayo de 2011, 22:21:37 »
Hola.

Pues ve guardando todo en un buffer y luego lo envias como string ...

Saludos
El papel lo aguanta todo

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Convertir caracter en valor numerico en CCS
« Respuesta #9 en: 20 de Mayo de 2011, 22:37:06 »
Y como puedo hacer eso? disculpa la ignorancia pero no entiendo....

Estas diciendo algo de esta forma??:

Código: [Seleccionar]
if(usb_cdc_kbhit())
         {
         recep_pc = usb_cdc_getc();
         printf(usb_cdc_putc,"%c",recep_pc);
         recep_pc = string [0];
         }
 if(usb_cdc_kbhit())
         {
         recep_pc = usb_cdc_getc();
         printf(usb_cdc_putc,"%c",recep_pc);
         recep_pc = string [1];
         }
printf (usb_cdc_putc, "El string es: %c\n\r", string);  //luego de que tenga armado el string con la cantidad de caracteres que quiero,
                                       // pero que pasa si quiero que la cantidad de caracteres no sea fija???

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Convertir caracter en valor numerico en CCS
« Respuesta #10 en: 22 de Mayo de 2011, 19:52:37 »
Hola proyecto2009utu, has como dice MLO__, utilizando un buffer, una forma de hacerlo podría ser esta, claro que habría que pulirla un poco pero para que te hagas una idea...

Código: [Seleccionar]
do{                  // bucle infinito

   if(usb_cdc_kbhit()){
      recep_pc = usb_cdc_getc();
     
      if (recep_pc==0x0D) {                    // Si recibe <ENTER>
         
         printf(usb_cdc_putc,"El string es: "); // Presenta todo el string recibido
         for (t=0;t<indx;t++){
            printf(usb_cdc_putc,"%c",string[t]);
         }
         printf(usb_cdc_putc,"\n\r");
         indx=0;                                // y limpia el index
         
      }else{                                    // Si recibe cualquier otro caracter
     
         string[indx++]=recep_pc;               // lo almacena en el buffer...
         
      }
   }

}while (true);

Saludos.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Convertir caracter en valor numerico en CCS
« Respuesta #11 en: 22 de Mayo de 2011, 20:23:19 »
Hola.

Para no usar el for, se puede usar el %s directamente:

Código: [Seleccionar]
printf(usb_cdc_putc,"%s",string)
Saludos
El papel lo aguanta todo

Desconectado proyecto2009utu

  • PIC12
  • **
  • Mensajes: 62
Re: Convertir caracter en valor numerico en CCS
« Respuesta #12 en: 23 de Mayo de 2011, 16:20:33 »
Buenas, ok eso anda.... les muestro mis resultados en la imagen  :)

Aunque como veran hay cosas extrañas hay caracteres que no me toma....  :shock:

Use el codigo exacamente como esta piblicado por MarkKnopfler81

y las variables las defini asi, no se si hay algun error en eso:
Código: [Seleccionar]
int  t;      //Variable de 8 bytes
char indx, string[];
int  recep_pc;       //Variable para tomar caracter

Disculpen que insista, pero esto no se puede hacer mas sencillo con usb_gets()???? ya que ahora quiero probar el manejo de caracteres entre la PC y el PIC....
Pero mi idea es recibir informacion de uno a otro a travez del USB.
Este es el hilo que popuse para discutir eso:
http://www.todopic.com.ar/foros/index.php?topic=34863.new;topicseen#new

Muchas gracias por darme una idea al respecto 


 

anything