Escritura - LEctura RS-232 dsPIC30F4012

#1
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
 
#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[B], aumentar los bits que se reciben y el tiempo[/B]

//n=atof(rec); //convertir a double
[B]n= strtod(rec, NULL);[/B] //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;

}
 
Arriba