TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aitorsp en 19 de Octubre de 2011, 12:21:10

Título: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 19 de Octubre de 2011, 12:21:10
Hola:

intento recibir un numero float mediante int_rda() pero no lo consigo.


#include <16f88.h>
//#device adc=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)

#use fast_io(b)
#use fast_io(a)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A3

#define LCD_RS PIN_A4
#define LCD_E PIN_A6

#include "flex_lcd.c"

float num;
char c;

#int_rda //vector de interrupción al recibir por la UART
RDA_isr(){
lcd_gotoxy(1,1);
c=getc();
num=c;
printf(lcd_putc,"Recibiendo %f",num);
lcd_gotoxy(2,1);
}
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0x00);
set_tris_b(0b00000100); // Rx entrada
//int aux;
//float voltage;
//setup_adc_ports(SAN2|VSS_VDD);
//setup_adc(ADC_CLOCK_INTERNAL);
output_b(0x00);
output_a(0x00);
lcd_init();
enable_interrupts(INT_RDA); //habilita interrupción por recepción
enable_interrupts(global);
//set_adc_channel(2);
while( 1 ){
}
}

En el codigo transmisor como prueba envio el numero 2.8 que es lo que deberia recibir el pic.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: MerLiNz en 19 de Octubre de 2011, 13:06:22
un float contiene 32 bits, osea 4 char, si putc solo admite un char, debes hacer putc 4 veces, y el receptor getc 4 veces, todo ello incrementando el estado de memoria para enviar los 4 bytes del float.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 19 de Octubre de 2011, 13:33:32
Una forma de hacerlo puede ser la siguiente:

Código: C
  1. float Data;
  2.  
  3. #int_rda //vector de interrupción al recibir por la UART
  4. RDA_isr(){
  5.  
  6.     *((char *)&Data)=getc();
  7.     // puede que sea necesario agregar la espera de disponibilidad de datos para lectura...
  8.     *((char *)&Data+1)=getc();
  9.     *((char *)&Data+2)=getc();
  10.     *((char *)&Data+3)=getc();
  11.  
  12.     kbhit_data_serial=1;
  13. }
  14.  
  15.  
  16.  
  17.  
  18. void main(void){
  19.  
  20.  
  21.     //  ...
  22.  
  23.     while(1){
  24.          if(kbhit_data_serial==1){
  25.               kbhit_data_serial=0;
  26.               lcd_gotoxy(1,1);
  27.               printf(lcd_putc,"Recibiendo %f",Data);
  28.          }
  29.     }
  30.  
  31. }


Recuerda que el que transmite el dato debe hacerlo de la misma manera, o sea el primer byte que envia es el LSB

Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 19 de Octubre de 2011, 15:58:10
Una forma de hacerlo puede ser la siguiente:

    float Data;

Código: C
  1. #int_rda //vector de interrupción al recibir por la UART
  2. RDA_isr(){
  3.  
  4.     *((char *)Data)=getc();
  5.     // puede que sea necesario agregar la espera de disponibilidad de datos para lectura...
  6.     *((char *)Data+1)=getc();
  7.     *((char *)Data+2)=getc();
  8.     *((char *)Data+3)=getc();
  9.  
  10.     kbhit_data_serial=1;
  11. }
  12.  
  13.  
  14.  
  15.  
  16. void main(void){
  17.  
  18.  
  19.     //  ...
  20.  
  21.     while(1){
  22.          if(kbhit_data_serial==1){
  23.               kbhit_data_serial=0;
  24.               lcd_gotoxy(1,1);
  25.               printf(lcd_putc,"Recibiendo %f",Data);
  26.          }
  27.     }
  28.  
  29. }


Recuerda que el que transmite el dato debe hacerlo de la misma manera, o sea el primer byte que envia es el LSB

Saludos!

Suky, porque pones Data, Data+1, Data+2, Data+3 ?. Supongo que Data se definira como char no?

En la transmision lo envio asi:

float valor=2.8;

while(1){
    printf("%f",valor);
}
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 19 de Octubre de 2011, 16:06:19
Data es float, lo defino en el mismo ejemplo  ;-) En ese caso se recibe directamente la variable float, que es de 4-bytes, como dice MerLiNz. En ese caso tu tienes que recibir un string.

Podrías hacer:

printf("%f\n",valor);

Y para recibir, cargar todo en un arreglo hasta recibir el carácter '\n'


Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 19 de Octubre de 2011, 16:22:05
Data es float, lo defino en el mismo ejemplo  ;-) En ese caso se recibe directamente la variable float, que es de 4-bytes, como dice MerLiNz. En ese caso tu tienes que recibir un string.

Podrías hacer:

printf("%f\n",valor);

Y para recibir, cargar todo en un arreglo hasta recibir el carácter '\n'


Saludos!

Ah ok, creo haberlo entendido. Has creado un puntero que va aumentado su posicion en 1 cada vez que recibes un byte.

*((char *)Data+1)=getc();

por tanto haces casting a char. es asi?

Al implementarlo de este modo

RDA_isr(){
   *((char *)Data)=getc();
   // puede que sea necesario agregar la espera de disponibilidad de datos para lectura...
   *((char *)Data+1)=getc();
   *((char *)Data+2)=getc();
   *((char *)Data+3)=getc();
   kbhit_data_serial=1;
}

habria que enviar desde el transmisor del mismo modo, es decir, los 5 bytes correspondientes a float pero claro, si yo lo hago asi:

float numero=2.8;
printf(" %f ", numero);

numero que es float habria que separarlo en 5 bytes no?
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: MerLiNz en 19 de Octubre de 2011, 17:38:34
mas sencillo:

char *p;
float aa;

p=&aa;

*p++=getc();
*p++=getc();
*p++=getc();
*p++=getc();
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 19 de Octubre de 2011, 19:21:57
Data es float, lo defino en el mismo ejemplo  ;-) En ese caso se recibe directamente la variable float, que es de 4-bytes, como dice MerLiNz. En ese caso tu tienes que recibir un string.

Podrías hacer:

printf("%f\n",valor);

Y para recibir, cargar todo en un arreglo hasta recibir el carácter '\n'


Saludos!

Ah ok, creo haberlo entendido. Has creado un puntero que va aumentado su posicion en 1 cada vez que recibes un byte.

*((char *)&Data+1)=getc();

por tanto haces casting a char. es asi?

Al implementarlo de este modo

RDA_isr(){
   *((char *)&Data)=getc();
   // puede que sea necesario agregar la espera de disponibilidad de datos para lectura...
   *((char *)&Data+1)=getc();
   *((char *)&Data+2)=getc();
   *((char *)&Data+3)=getc();
   kbhit_data_serial=1;
}

habria que enviar desde el transmisor del mismo modo, es decir, los 5 bytes correspondientes a float pero claro, si yo lo hago asi:

float numero=2.8;
printf(" %f ", numero);

numero que es float habria que separarlo en 5 bytes no?

Claro, tendrías que enviarlo de la misma forma sin formatear la variable a un string:

Código: C
  1. float Data;
  2.  
  3.    putc(*((char *)&Data));
  4.    putc(*((char *)&Data+1));
  5.    putc(*((char *)&Data+2));
  6.    putc(*((char *)&Data+3));

Lo que se hace es enviar cada byte que compone la variable float.

Una variable float se puede descomponer en 4 bytes:

MB                        | UB                         | HB                           | LB

*((char *)&Data+3)  | *((char *)&Data+2)  |  *((char *)&Data+1)   |  *((char *)&Data+0)








mas sencillo:

char *p;
float aa;

p=&aa;

 :) Casi, si lo haces así te indicará error, lo que hay que hacer es:

p=(char *)&aa;


 ;-)


Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: MerLiNz en 19 de Octubre de 2011, 19:53:48
en el C18 no indica error, unicamente un warning de conversion de tipo, pero el compilador lo hace bien, date cuenta que un puntero almacena una direccion de memoria, independientemente al tipo que pertenezca, un puntero de char tiene la misma capacidad que uno de float, en el C18 puedes declararlo como near o far para que el puntero pueda almacenar una direccion mas lejana o cercana.

Pero como estamos en CCS pues nidea, supongo que algo similar pasara.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: jeremylf en 19 de Octubre de 2011, 19:56:04
En el archivo input.c puedes encontrar una función que se llama get_float(). Nunca he usado nada de ahi, pero puedes darle una mirada haber si te sirve.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 19 de Octubre de 2011, 21:05:40
en el C18 no indica error, unicamente un warning de conversion de tipo, pero el compilador lo hace bien, date cuenta que un puntero almacena una direccion de memoria, independientemente al tipo que pertenezca, un puntero de char tiene la misma capacidad que uno de float, en el C18 puedes declararlo como near o far para que el puntero pueda almacenar una direccion mas lejana o cercana.

 :mrgreen:  Seguro? Puede ser la versión del compilador :rolleyes:

Porque aveces dice Error [1131] type mismatch in assignment   :undecided:  :mrgreen:


Eso de near y far intento explicarlo por aquí (http://www.todopic.com.ar/foros/index.php?topic=31611.0)


Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: MerLiNz en 19 de Octubre de 2011, 21:43:38
si, yo a veces he tenido casos de que te da errores, y en otro no. Tampoco me he puesto a investigarlo xD, cuando da error (char*) y se acabo xD

Lo del near far es sencillo, creo recordar que el near intentaba usar un puntero con 16bits maximo, y el far usa 24bits de direccion. Ahora dependiendo si es rom o ram pues cambia, pero no tiene mucha historia, la guia del C18 lo explica en 1 pagina.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 20 de Octubre de 2011, 00:42:39
si, yo a veces he tenido casos de que te da errores, y en otro no. Tampoco me he puesto a investigarlo xD, cuando da error (char*) y se acabo xD

xD

Lo del near far es sencillo, creo recordar que el near intentaba usar un puntero con 16bits maximo, y el far usa 24bits de direccion. Ahora dependiendo si es rom o ram pues cambia, pero no tiene mucha historia, la guia del C18 lo explica en 1 pagina.

+1  :mrgreen:
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 20 de Octubre de 2011, 06:45:46
No me funciona bien, no envia correctamente el valor float. dejo los codigos de emisor y receptor.

Codigo emisor:

#device adc=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)
#use fast_io(a)
#use fast_io(b)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A7
#define LCD_DB7 PIN_A6

#define LCD_RS PIN_B7
#define LCD_E PIN_B6

#include "flex_lcd420.c"

void main(){
float Data;
set_tris_a(0b00000000);
set_tris_b(0b00000000);
setup_adc_ports(NO_ANALOGS);

lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc("Inicio Bluetooth"));
delay_ms(2000);
while(1){
Data=2.6;
putc(*((char *)Data));
delay_ms(10);
putc(*((char *)Data+1));
delay_ms(10);
putc(*((char *)Data+2));
delay_ms(10);
putc(*((char *)Data+3));
}
}


Codigo receptor:

#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)

#use fast_io(b)
#use fast_io(a)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A3

#define LCD_RS PIN_A4
#define LCD_E PIN_A6

#include "flex_lcd.c"

int kbhit_data_serial;
float Data;
#int_rda //vector de interrupción al recibir por la UART
RDA_isr(){
   *((char *)Data)=getc();
   delay_ms(10);
   *((char *)Data+1)=getc();
   delay_ms(10);
   *((char *)Data+2)=getc();
   delay_ms(10);
   *((char *)Data+3)=getc();
   kbhit_data_serial=1;
}
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0x00);
set_tris_b(0b00000100); // Rx entrada
output_b(0x00);
output_a(0x00);
lcd_init();
enable_interrupts(INT_RDA); //habilita interrupción por recepción
enable_interrupts(global);

while(1){
   if(kbhit_data_serial==1){
      kbhit_data_serial=0;
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Recibiendo %f",Data);
      }
   }
}
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 20 de Octubre de 2011, 10:44:26
 :x Me olvide lo importante, el operador &

Es así por ejemplo:

*((char)&Data+1)


Agregarle a todos. Disculpas.


Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 20 de Octubre de 2011, 11:11:16
:x Me olvide lo importante, el operador &

Es así por ejemplo:

*((char)&Data+1)

Agregarle a todos. Disculpas.

Saludos!

Finalmente en la simulacion de proteus va bien con este codigo:

codigo emisor:

#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)
#use fast_io(a)
#use fast_io(b)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A7
#define LCD_DB7 PIN_A6

#define LCD_RS PIN_B7
#define LCD_E PIN_B6

#include "flex_lcd420.c"

void main(){
float Data;
set_tris_a(0b00000000);
set_tris_b(0b00000000);
setup_adc_ports(NO_ANALOGS);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc("Inicio Bluetooth"));
delay_ms(2000);
while(1){
Data=2.6;
putc(*((char *)&Data));
putc(*((char *)&Data+1));
putc(*((char *)&Data+2));
putc(*((char *)&Data+3));
delay_ms(1000);
}
}


codigo receptor:

#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)

#use fast_io(b)
#use fast_io(a)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A3

#define LCD_RS PIN_A4
#define LCD_E PIN_A6

#include "flex_lcd.c"

int kbhit_data_serial;
float Data;
#int_rda //vector de interrupción al recibir por la UART
RDA_isr(){
  *((char *)&Data)=getc();
  *((char *)&Data+1)=getc();
  *((char *)&Data+2)=getc();
  *((char *)&Data+3)=getc();
   kbhit_data_serial=1;
}
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0x00);
set_tris_b(0b00000100); // Rx entrada
output_b(0x00);
output_a(0x00);
lcd_init();
enable_interrupts(INT_RDA); //habilita interrupción por recepción
enable_interrupts(global);

while(1){
   if(kbhit_data_serial==1){
      kbhit_data_serial=0;
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fRecibiendo %01.2f",Data);
      }
   }
}

En proteus envia bien el float pero cuando monto el hardware solo se ve en la lcd receptora 0.00.
El envio se hace atraves de un bluetooth BTM-5 que lleva la conexion rs232 ya incluida y con los pines listos para utilizar. En principio si en proteus va bien deberia funcionar con el hardware real.

Es posible que el bluetooth codifique los datos de algun modo?. segun el manual es comunicacion rs232 con lo que tendria que funcionar.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: AngelGris en 20 de Octubre de 2011, 11:24:43
  En este punto creo que conviene aplicar el principio de "divide y reinarás". Me parece que sería bueno realizar la prueba entre pics sin modulo de bluetooth de por medio. O sea, conectas el pin TX de pic transmisor al pin RX del receptor y verificas que es lo que ocurre y si así funciona bien pues habrá que observar bien el tema con el módulo. Tal vez pueda ser algún inconveniente con la velocidad o alguna configuración extra que haya que enviarle al módulo.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 20 de Octubre de 2011, 11:28:00
:x Me olvide lo importante, el operador &

Es así por ejemplo:

*((char)&Data+1)

Agregarle a todos. Disculpas.

Saludos!

Finalmente en la simulacion de proteus va bien con este codigo:

codigo emisor:

#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)
#use fast_io(a)
#use fast_io(b)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A7
#define LCD_DB7 PIN_A6

#define LCD_RS PIN_B7
#define LCD_E PIN_B6

#include "flex_lcd420.c"

void main(){
float Data;
set_tris_a(0b00000000);
set_tris_b(0b00000000);
setup_adc_ports(NO_ANALOGS);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc("Inicio Bluetooth"));
delay_ms(2000);
while(1){
Data=2.6;
putc(*((char *)&Data));
putc(*((char *)&Data+1));
putc(*((char *)&Data+2));
putc(*((char *)&Data+3));
delay_ms(1000);
}
}


codigo receptor:

#include <16f88.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)

#use fast_io(b)
#use fast_io(a)

#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A3

#define LCD_RS PIN_A4
#define LCD_E PIN_A6

#include "flex_lcd.c"

int kbhit_data_serial;
float Data;
#int_rda //vector de interrupción al recibir por la UART
RDA_isr(){
  *((char *)&Data)=getc();
  *((char *)&Data+1)=getc();
  *((char *)&Data+2)=getc();
  *((char *)&Data+3)=getc();
   kbhit_data_serial=1;
}
void main(){
setup_adc_ports(NO_ANALOGS);
set_tris_a(0x00);
set_tris_b(0b00000100); // Rx entrada
output_b(0x00);
output_a(0x00);
lcd_init();
enable_interrupts(INT_RDA); //habilita interrupción por recepción
enable_interrupts(global);

while(1){
   if(kbhit_data_serial==1){
      kbhit_data_serial=0;
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fRecibiendo %01.2f",Data);
      }
   }
}

En proteus envia bien el float pero cuando monto el hardware solo se ve en la lcd receptora 0.00.
El envio se hace atraves de un bluetooth BTM-5 que lleva la conexion rs232 ya incluida y con los pines listos para utilizar. En principio si en proteus va bien deberia funcionar con el hardware real.

Es posible que el bluetooth codifique los datos de algun modo?. segun el manual es comunicacion rs232 con lo que tendria que funcionar.

he probado a conectar los dos pic directamente Tx de uno con Rx del otro y funciona en determinados momentos. A veces aparece 0.00 y a veces el float que le mando desde el pic transmisor. Quizas sea un problema de ajustar los tiempos cuando recibe el float ó cuando se envia.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: gera en 20 de Octubre de 2011, 11:59:13
Hola!! Yo implemente facilmente esto pasando el float como un string y convirtiendolo con la funcion atof. Les dejo un ejemplo.
Código: C
  1. #int_rda
  2. void serial_isr(){
  3.   char key[16];
  4.  
  5.   if(kbhit()){
  6.     gets(key);
  7.     switch(key[0]){
  8.          case 'p':
  9.             if(key[1]!=0)
  10.                Kp = atof((key+1));
  11.             printf("Kp = %.4f\r\n",Kp);
  12.             break;
  13.          case 'i':
  14.             if(key[1]!=0)
  15.                Ki = atof((key+1));
  16.             printf("Ki = %.4f\r\n",Ki);
  17.             break;
  18.          case 'd':
  19.             if(key[1]!=0)
  20.                Kd = atof((key+1));
  21.             printf("Kd = %.4f\r\n",Kd);
  22.             break;
  23.          case 'r':
  24.             if(key[1]!=0)
  25.                PID.rT = atof((key+1));
  26.             printf("rT = %.4f\r\n",PID.rT);
  27.             break;
  28.          default:
  29.             printf("error: comando desconocido\r\n");
  30.             break;
  31.       }
  32.   }
  33. }

Lo que hace es verificar la primera letra para saber qué variable modificar, y luego modifica el valor de esa variable por el numero que acompaña a la letra. Entonces desde una consola ponemos por ej:
p3.51\r
y ahora la variable kp va a tener el valor 3.51
saludos!!!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 21 de Octubre de 2011, 17:17:18
Estoy pensando que quizas al declarar asi la variable Data

float Data;

putc(*((char *)&Data));

ahi se utiliza como puntero. Es posible que el problema este en usarlo de este modo?

Suky, no hay otra alternativa para enviar el float sin utilizar punteros ?
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: gera en 21 de Octubre de 2011, 17:32:31
Estoy pensando que quizas al declarar asi la variable Data

float Data;

putc(*((char *)&Data));

ahi se utiliza como puntero. Es posible que el problema este en usarlo de este modo?

Suky, no hay otra alternativa para enviar el float sin utilizar punteros ?

no leiste lo que puse arriba no? funciona perfectamente, yo ya lo probe.
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: MerLiNz en 21 de Octubre de 2011, 18:40:38
puedes usar uniones:

union {
char bytes[4];
float Data;
}datos;

lo que guardes en byte
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: Suky en 21 de Octubre de 2011, 18:44:41
Otra forma es como lo muestra Gera... Aunque no veo porque pueda fallar  :o Otra forma:

Código: C
  1. typedef union{
  2.     float Val;
  3.     unsgined char V[4];
  4. }DATA_FLOAT;
  5.  
  6.  
  7. DATA_FLOAT Data;
  8.  
  9. Data.Val=2.356;
  10.  
  11. putc(Data.V[0]);
  12. putc(Data.V[1]);
  13. putc(Data.V[2]);
  14. putc(Data.V[3]);

Y después:

Código: C
  1. DATA_FLOAT Data;
  2.  
  3. Data.V[0]=getc();
  4. Data.V[1]=getc();
  5. Data.V[2]=getc();
  6. Data.V[3]=getc();


Saludos!
Título: Re: Como recibir un float utilizando int_rda()
Publicado por: aitorsp en 21 de Octubre de 2011, 19:47:16
me acabo de dar cuenta de que la velocidad de transmision por defecto de fabrica para este modelo es 115200 y no 38400 como yo habia puesto en el codigo del pic. mañana comprobaré el hardware de nuevo pero sí, llevais razon, deberia funcionar porque en proteus no da ningun problema.