Una forma de hacerlo puede ser la siguiente:
float Data;Código: C
#int_rda //vector de interrupción al recibir por la UART RDA_isr(){ // puede que sea necesario agregar la espera de disponibilidad de datos para lectura... kbhit_data_serial=1; } void main(void){ // ... while(1){ if(kbhit_data_serial==1){ kbhit_data_serial=0; lcd_gotoxy(1,1); } } }
Recuerda que el que transmite el dato debe hacerlo de la misma manera, o sea el primer byte que envia es el LSB
Saludos!
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!
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?
mas sencillo:
char *p;
float aa;
p=&aa;
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.
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.
:x Me olvide lo importante, el operador &
Es así por ejemplo:
*((char)&Data+1)
Agregarle a todos. Disculpas.
Saludos!
: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.
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 ?