Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/11/2010 #1


Escritura - LEctura RS-232 dsPIC30F4012
Buenas tardes a todos, llevo 3 días atascado en una parte muy simple de la interrupción de puerto serie para la comunicación con un dsPIC.

Lo único que quiero es recibir desde PC un dato y volver a mandarle para comprobar, todo esto dentro de la interrupcion del puerto serie.

El código es muy simple

void __attribute__((interrupt,auto_psv)) _U1RXInterrupt(void)
{
char mand[50];
char rec[10];
int a=0;
double n;

DisableIntU1RX;

while(!DataRdyUART1())
a=getsUART1(6, (unsigned int*)rec, 20); //lectura puerto serie

n=atof(rec); //convertir a double

sprintf(mand,"a=%d result %f",a,n);
putsUART1((unsigned int *)mand);
while(BusyUART1());

CloseUART1();
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
EnableIntU1RX;

}


La interrupcion funciona y el envio al PC de un dato que yo quiera o una cadena funciona perfectamente, pero no logro leer correcto lo que mando yo desde el PC

Seguro que es un error muy simple, pero no logro resolverlo.

Con este código me llega siempre el mismo valor.
para sustituir la función atof, lo que he hecho para probar ha sido

n=(double)rec[0]*10+(double)rec[1]+(double)rec[2]/10+(double)rec[3]/100+(double)rec[4]/1000;

y el resultado es siempre el mismo independiente de lo que mande desde PC

Muchas gracias de antemano
30/11/2010 #2


Me auto-respondo por si ha alguien le sirve:

El codigo solucion es el siguiente:

Código:
void __attribute__((interrupt,auto_psv)) _U1RXInterrupt(void)
{
char mand[50];
char rec[10];
int a=0;
double n;

DisableIntU1RX;

//while(!DataRdyUART1()) //sobra porque lo hago desde interrupcion

a=getsUART1(75, (unsigned int*)rec, 1000); //lectura puerto serie, aumentar los bits que se reciben y el tiempo

//n=atof(rec); //convertir a double
n= strtod(rec, NULL); //forma de pasar datos en ASCII a double

sprintf(mand,"a=%d result %f",a,n);
putsUART1((unsigned int *)mand);
while(BusyUART1());

CloseUART1();	
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
EnableIntU1RX;

}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.