TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Daoíz en 29 de Noviembre de 2010, 15:43:01
-
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
No se si lo mejor será usar la función readUART1 en vez de getsUART1, qué me comentais?
Muchas gracias de antemano
-
Hola, si entras a la int_rx quiere decir que hay un byte disponible por leer. Esta línea está sobrando...
while(!DataRdyUART1())
Además de que no le pusiste punto-y-coma al final.
No recuerdo los argumentos y prototipo de getsuartx, por favor ponlos para ver si está bien empleada.
-
Muchas gracias, funcionó.
Lo único que ahora tengo el problema del tipo de datos.
Quiero mandar un dato double con 3 decimales desde un programa de visual Basic, tengo que estudiar como hacer la transmisión, porque ahora mismo si mando un 0 me devuelve, en rec[0] 48 y no lo entiendo muy bien.
Lo estudio y os lo comento, por cierto la función atof no funciona en absoluto, no se por qué será. Pero si uso atof siempre me devuelve un 0.00000
El código ha quedado como muestro
void __attribute__((interrupt,auto_psv)) _U1RXInterrupt(void)
{
char mand[50];
char rec[10];
int a=0, i=0;
double n;
DisableIntU1RX;
a=getsUART1(6, (unsigned int*)rec, 20);
n=(double)rec[0];
//n=atof(rec);
sprintf(mand,"%f\n",n);
putsUART1((unsigned int *)mand);
while(BusyUART1());
CloseUART1();
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
EnableIntU1RX;
}