Autor Tema: Escritura - LEctura RS-232 dsPIC30F4012  (Leído 2488 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daoíz

  • PIC10
  • *
  • Mensajes: 2
Escritura - LEctura RS-232 dsPIC30F4012
« 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

Código: [Seleccionar]
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

Código: [Seleccionar]
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
« Última modificación: 29 de Noviembre de 2010, 15:45:49 por Daoíz »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Escritura - LEctura RS-232 dsPIC30F4012
« Respuesta #1 en: 29 de Noviembre de 2010, 15:56:53 »
Hola, si entras a la int_rx quiere decir que hay un byte disponible por leer. Esta línea está sobrando...

Código: [Seleccionar]
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.

Desconectado Daoíz

  • PIC10
  • *
  • Mensajes: 2
Re: Escritura - LEctura RS-232 dsPIC30F4012
« Respuesta #2 en: 29 de Noviembre de 2010, 16:10:46 »
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

Código: [Seleccionar]
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;

}