Autor Tema: getsUSART y el timeout  (Leído 2688 veces)

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

Desconectado medidort

  • PIC10
  • *
  • Mensajes: 17
getsUSART y el timeout
« en: 19 de Julio de 2012, 21:48:57 »
Hola todos.
Estoy escribiendo un codigo para recibir 15 bytes por el puerto serie utilizando interrupciones.
El problema es que usando la linea getsUSART el PIC se queda trancado sino recibo 15.
Actualmente envolvi la recepcion usart con un timer para que si se queda mas de tanto tiempo salga, no me funciono. El timer funciona bien. En que le estoy errando?

   if (PIR1bits.RCIF == 1){   
         while(timeoutUSART == FALSE){
            T3CONbits.TMR3ON = 1;
            error1 = 0;
            //LEO EL DATO
            getsUSART(tramaXUSB , 14);
            PIR1bits.RCIF = 0;
            timeoutUSART = FALSE;
            tramaCompleta = TRUE;
         }
}


   //TIMER 3
      //USADO PARA QUE NO SE CUELGUE LA USART   
      
      if (PIR2bits.TMR3IF){           
         TMR3H = 0x15;         //5536 = 40ms      
         TMR3L = 0xA0;
         PIR2bits.TMR3IF =0;
         if (error1==13){   //520ms = 13
            timeoutUSART = TRUE;
            PIR1bits.RCIF = 0;
            
         }
         error1++;
         
         
      }

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: getsUSART y el timeout
« Respuesta #1 en: 21 de Julio de 2012, 14:11:56 »
Hola, voy a empezar en algo parecido, lo tengo hecho en ASM y lo voy a pasar en C, pero recien empiezo en esto, te comento como lo hago: no uso interrupcione, primero busco la recepción del carácter, luego verifico si hay, la guardo y vuelvo a buscar, si no empiezo una rutina de delay por el ancho del byte decrezco un contador, que va a servir de veces para buscar, y vuelvo a buscar el dato en la recepción, así si por el byte 5, como ejemplo, se deja de transmitir el contador que decrezco con el delay llega a 0 y me saca de la función y me advierte de un error en la recepción.
No puedo comentarte sobre tu programa ya que estoy verde en C pero espero que lo que te comente te ayude a resolverlo.
Saludos

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: getsUSART y el timeout
« Respuesta #2 en: 23 de Agosto de 2012, 19:34:25 »
Saludos yo creo que el problema esta en la funcion getsUSART, si vemos como es por dentro tenemos:


Citar
void getsUSART(char *buffer, unsigned char len)
{
  char i;    // Length counter
  unsigned char data;

  for(i=0;i<len;i++)  // Only retrieve len characters
  {
    while(!DataRdyUSART());// Wait for data to be received

    data = getcUSART();    // Get a character from the USART
                           // and save in the string
    *buffer = data;
    buffer++;              // Increment the string pointer
  }
}

no es mas que un for con el numero de caracteres que vas a obtener y los obtiene con la funcion getcUSART.

El problemas esta en el while(!DataRdyUSART()); en el cual se queda hasta que haya un caracter para leer en el puerto. por lo cual se le dices que quieres leer 15 el for se crea de 15 pero si solo hay para leer 11, la variable i se queda en el valor 11 y el programa se queda parado en el while hasta que le manden los 4 bytes restantes.

Una solucion es implementarle un timer o un contador(es la que uso yo) a ese while para que si ya paso cierto tiempo sin recibir se salga.


Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: getsUSART y el timeout
« Respuesta #3 en: 04 de Septiembre de 2012, 15:02:03 »
Hola yo lo hago en ASM como decís, con un temporizador, que es del largo del bit a recibir, y un contador que si me paso regreso a la funcion principal, pero agrego algo y es que si estoy esperando 15 caracters y recivo solo 11 cuando regreso verifico eso y doy un error en la recepción.
Saludos