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
buffer[indice] = '\0';, ¿no añadiria un nulo después de cada caracter recibido?Perdonadme si meto la pata, peroCó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?
#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..
}}
#INCLUDE <16F877a.h>
#FUSES NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#USE delay (clock=4000000) //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>
int lectura=0x00,destino[8],dato[8];
//char convert[8];
int x=0,w=0,z=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 || x==4){ //llego el retorno de carro.. (caracter 0x13)...sí..
if(lectura==0x0D){
z=x-1;
dato[z]='\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,"%C%C%C",dato[0],dato[1]dato[2]); //imprimo en LCD los datos del puerto serie.....
//sin contar con la R y el retorno de carro....
lcd_gotoxy( 1, 3);
printf(lcd_putc,"%S",destino);
lcd_gotoxy( 1, 4);
printf(lcd_putc,"%i",x);
}}
Si te envía constantemente la información es posible que se esté llenando el registro RCREG (que es donde el PIC almacena lo que llega por el UART) y cuando quiera llegar otro dato se genere un error de overflow.
#INCLUDE <16F877a.h>
#FUSES NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#USE delay (clock=4000000) //clock=20Mhz
#USE rs232(baud=9600,parity=N,xmit=PIN_C6, rcv=PIN_C7,bits=8) //Configuracion del puerto serie....
#DEFINE use_portb_lcd TRUE //definir portb lcd
#INCLUDE<LCD420.c>
#INCLUDE <stdlib.h>
#include <string.h>
char escritura=0x00,dato[8],sensor1[8];
int x=0,w=0;
float convert=0;
void copia_de_string(void){
strcpy( dato , sensor1 );
}
#int_RDA
void RDA_isr(void)
{
escritura=getc();
if(escritura==0x52){
x=1;
}
else if(escritura==0x0D && x==1){
w=0;
x=0;
copia_de_string();
}
else if((escritura!=0x52 || escritura!=0x0D) && x==1){
dato[w]=escritura;
w++;
dato[w]='\0';
}
}
void main() {
lcd_init(); //inicializa pantalla LCD
output_low(PIN_D1);
delay_ms(500);
////////////////////////////////////////// INICIALIZACIONES GENERALES
enable_interrupts(INT_RDA); //avilito interrupcion de resepcion serial
enable_interrupts(GLOBAL); // avilito todo lo necesario...
output_high(PIN_D1);
While(TRUE){ //infinito..........
convert=atof(sensor1);
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",sensor1);
lcd_gotoxy(1,3);
printf(lcd_putc,"sensor 1 portb_LCD");
}}
........, pero ahora me pasa otra cosa y es que al energizar el pic se queda pegado y no toma lectura del sensor, luego lo reseteo y hay empiesa bn, he intentado con desavilitar la interrupcion al principio del main mas unos delay de 300ms, pero aun asi sigue sin efecto, como podre desavilitar la interrupcion o algo para que la uart no tome registro alguno de lo que le llega al pic??. otra pregunta con respecto a la ejecucion del programa, cuanto se demora en poner el pic los pines de la forma que se le dice adentro del main?? abra otra forma para que al energizar el pic, los pines que quiero ya esten un el esto que le indico??
o el pic parte inicialmente con los pines en alta impedancia ?????