Autor Tema: pasar cadena a float o int  (Leído 9273 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
pasar cadena a float o int
« en: 15 de Febrero de 2011, 16:52:37 »
hola otra vez, tengo una duda, estoy en un codigo en el cual quiero ir almasenando unos valores de ascii en un string, esto es a medida que van llegando, pero luego al presionar la tecla de retorno, quiero que este string se transforme en entero. osea el programa manda por la rs232 numeros en ascii y yo quiero que cuando ayan siertos numero inprimir estos pero en entero. como lo puedo hacer, he esto intentando con el atoi y atol y no me resulta.

saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: pasar cadena a float o int
« Respuesta #1 en: 15 de Febrero de 2011, 16:57:45 »
Es al revés, usa ftoa (float to ascii).

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #2 en: 15 de Febrero de 2011, 17:37:36 »
hola migsantiago, gracias por responder, pero no me sirve asi, tiene que ser de ascii a int o float, o simplemente como puedo leer todo el string que tiene estos numeros  en ascci
y mostrarlo en una ldc como un solo numero ?¡?¡
saludos
« Última modificación: 15 de Febrero de 2011, 18:24:34 por japifer_22 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #3 en: 15 de Febrero de 2011, 19:11:35 »
  Se pueden almacenar en un buffer en forma contigua y luego mostrás todo. La idea sería algo así...

Código: C
  1. char buffer[15]; defino un buffer que almacene 14 caracteres + el caracter nulo para indicar el fin
  2. char indice;
  3. // luego en la rutina de llegada de informacion del rs232
  4.  
  5. char caracter;
  6. indice = 0;
  7.  
  8. do
  9. {
  10.   caracter = getch();
  11.   if (caracter != 13) // si no es el enter
  12.   {
  13.     buffer[indice] = caracter;
  14.     indice++;
  15.     buffer[indice] = '\0'; // me aseguro de colocar el caracter nulo que indica el fin de la cadena
  16.   }
  17. }
  18. while (caracter != 13)  // se repite todo lo anterior hasta que llega un enter

  Con lo anterior lograríamos almacenar en la variable buffer una cadena de caracteres
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: pasar cadena a float o int
« Respuesta #4 en: 15 de Febrero de 2011, 19:35:46 »
hola migsantiago, gracias por responder, pero no me sirve asi, tiene que ser de ascii a int o float, o simplemente como puedo leer todo el string que tiene estos numeros  en ascci
y mostrarlo en una ldc como un solo numero ?¡?¡
saludos

Angelgris te ha resuelto todo el problema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #5 en: 15 de Febrero de 2011, 22:26:53 »
hola gracias por la respuestas se pasaron, pero me queda la ultima duda, y es con respecto a que si yo puedo copiar en este caso buffer con strcpy y, asi asignar lo que tiene este a otro string, y por ultimo para yo poder ver los datos  que estan en este buffer en una LCD tendria que poner printf(lcd_putc,"%s"buffer); es asi o no ??y reitero gracias a los dos por las respuestas.

saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #6 en: 15 de Febrero de 2011, 22:44:40 »
  Se puede usar strcpy para copiar el buffer sin problemas, en cuanto a usar printf de la forma que decís no sabría decirte porque no uso CCS.
« Última modificación: 16 de Febrero de 2011, 00:06:26 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
Re: pasar cadena a float o int
« Respuesta #7 en: 16 de Febrero de 2011, 06:59:07 »
Perdonadme si meto la pata, pero
Código: [Seleccionar]
buffer[indice] = '\0';, ¿no añadiria un nulo después de cada caracter recibido?

¿no se tiene que recibir la cadena toda seguida?

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #8 en: 16 de Febrero de 2011, 08:10:00 »
a oka, pero entonces de que forma puedo visualisar el buffer entero en una lcd ????

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #9 en: 16 de Febrero de 2011, 09:08:23 »
Perdonadme si meto la pata, pero
Código: [Seleccionar]
buffer[indice] = '\0';, ¿no añadiria un nulo después de cada caracter recibido?

¿no se tiene que recibir la cadena toda seguida?

  Si, pero la cadena se sigue recibiendo hasta que llega el caracter "CarrierRetunr" que es 13 en decimal. Fijate que en la forma en que lo puse, primero se almacena el caracter que llega, luego incremento el índice y recién entonces pongo el caracter nulo. Eso lo hago por las dudas que antes hubiera almacenado una cadena más larga, y poniendo eso me aseguro que corte donde quiero.

  A ver si con un ejemplo lo muestro mejor.

  Estado anterior de buffer "hola mundo". Si ahora recibo sólo "chau" <CarrierReturn>. La variable buffer sería "chau mundo" porque el caracter nulo aparecía originalmente después de la o de mundo. Pero al ir agregando yo el caracter nulo, me va a quedar el caracter nulo luego de "chau" y por lo tanto en la variable buffer quedará sólo lo recibido.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
Re: pasar cadena a float o int
« Respuesta #10 en: 16 de Febrero de 2011, 09:11:40 »
Despues de la recepcion de la cadena borra el buffer.

Busca en el FORO recepcion de caracteres por interrupcion, hay mucha informacion. Si no te sale ya te ayudamos.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #11 en: 16 de Febrero de 2011, 09:37:06 »
oka voy a buscar ahora entonces lo que dice. gracias

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #12 en: 16 de Febrero de 2011, 11:12:20 »
hola, bueno veran he estado dandole a este tema y empece a darle al debug y lo raro de todo esto que la variable asociada a mi getc(), cada vez que le envio el R mayuscula o 0x52, me dice que llega un FF a esta variable y quedo sin entender del por que se produce esto, alguien save?????. dejo el codigo para que lo discutamos un poco ya ??

Código: [Seleccionar]
#INCLUDE <16F877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#USE delay (clock=20000000)         //clock=20Mhz
#USE rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=8) //Configuracion del puerto serie....
#DEFINE use_portd_lcd TRUE //definir portb lcd
#INCLUDE<LCD420puertD.c>  //libreria manejo lcd de 20x4 modificada por suky para el puerto D
#INCLUDE <stdlib.h>
#include <string.h>


char lectura=0x00,destino[8],dato[8];
//char convert[8];
int x=0,w=0;

#int_RDA
void  RDA_isr(void)
{
lectura=getc();                             //leo el puerto serie del pic
dato[x++]=lectura;                          //almaceno en variable dato el caracter ingresado....
                                            //he incremento en 1 para guardar le siguiente ddato....
if(lectura==0x52){                          //a llegado el caracter R...Sí... entonces....
dato[0]=0x00;                               //el primer caracter de la se borra del string...
x=0;                                        //y buelvo a posicion cero del string..
}
else if(lectura==0x0D){                     //llego el retorno de carro.. (caracter 0x13)...sí..
dato[x-1]='\0';                             //borro el caracter de retorno de carro y lo reemplazo por..
                                            //caracter nulo..
strcpy( destino,dato );                     //copio el dato de recepcion serial a otra variable...

for(w=0;w<x;w++){                           //borro el buff de recepcion de dato, "dato"....
dato[w]=0x00;
}
x=0;                                        //pongo en la posicon cero el dato de recepcion nuevo..
}
}

void main() {
 
////////////////////////////////////////// INICIALIZACIONES GENERALES
   lcd_init();                              //inicializa pantalla LCD
   enable_interrupts(INT_RDA);              //avilito interrupcion de resepcion serial   
   enable_interrupts(GLOBAL);               // avilito todo lo necesario...

   output_low(PIN_C0);                      //pone en cero el sensor2
   output_low(PIN_C1);                      //pone en uno el sensor1

While(TRUE){                                //infinito..........

   

   lcd_gotoxy( 1, 1);
   printf(lcd_putc,"%s",destino);           //imprimo en LCD los datos del puerto serie.....
                                            //sin contar con la R y el retorno de carro....
   printf("%s",destino);                    // imprimo en PC lo que llega al puerto serie..

}}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pasar cadena a float o int
« Respuesta #13 en: 16 de Febrero de 2011, 12:17:47 »
  ¿El circuito lo tenés armado en físico o estás simulando en Proteus? En el caso que estés simulando, corroborá que tengas bien la velocidad del PIC en Proteus, la velocidad del VirtualTerminal.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: pasar cadena a float o int
« Respuesta #14 en: 16 de Febrero de 2011, 12:25:49 »
hola lo tengo en placa de desarroyo, pero no me di cuenta que lo tenia corriendo a distinta velocidad  :oops: :oops: ,
pero el punto que sigo sin podr ver los valoresp or la LCD   :x


 

anything