Autor Tema: El u recibe mal los datos por puerto serie  (Leído 1665 veces)

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

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
El u recibe mal los datos por puerto serie
« en: 17 de Febrero de 2006, 12:09:00 »
Hola,

Tengo un pequeño problema, tengo q recibir 4 bytes seguidos por el puerto serie del u. El primer byte es un valor en hexa, q se usa como sincronismo, y los tres restantes son datos q tengo q guardar.
Hasta ahora, el u reconoce el sincronismo y lee sin problemas cualquier mensaje de un byte, pero cuando quiero hacer q lea cuatro bytes seguidos los lee mal y guarda datos erroneos.
Aca les mando la parte de codigo en cuestion:

void recepcion (int *range)      
{
   int a, ans=0;
    while (ans!=SYN)            //Busca un sincronismo especifico
   {  
      Delay1KTCYx(123);   //Delay de 200mseg                         transmit (pedido);      
         ans=recieve();   //Lee
   }
      
   for (a=0;a<3;a++)      //Lee el resultado
   {      
                               *(range+a)=recieve();
   }
   
}


transmit() y recieve() son dos funciones q transmiten y leen un byte (hasta donde se funcionan bien).


Les agradezco su ayuda.
Nyquist

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: El u recibe mal los datos por puerto serie
« Respuesta #1 en: 17 de Febrero de 2006, 16:07:00 »
No seria mejor que usaras los procedimientos que CCS lleva implantados, es decir getc() y putc()? Si es que no, podrias poner el codigo que corresponde a esos dos procedimientos que has definido?

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
RE: El u recibe mal los datos por puerto serie
« Respuesta #2 en: 20 de Febrero de 2006, 06:12:00 »
Hola,

Gracias por contestar. Lo q no aclare es q la comunicacion no es con una PC, por lo q no estoy segura q sirvan las funciones putc() y getc(). Hasta donde yo se getc() y putc() sirven para transmitir codigo ASCII y la informacion q estoy manejando son bytes cualesquiera, por lo q no creo q tampoco sirvan.

El problema no es para recibir un byte, sino para recibir 3 seguidos. Para esto implemente mi funcion recieve() dentro de for() (tambien lo hice con tres lineas de recieve() seguidas). Cuando simulo el programa todo funciona bien, pero cuando lo implemento no lee bien los tres datos seguidos.

Aca mando las funciones q me hice:

void transmit (int palabra)        //Transmite una palabra por el puerto serie
{
   TXSTAbits.TXEN=1;      //Habilito la transmicion
   TXREG = palabra;      //Mando palabra
   while(TXSTAbits.TRMT==0)      //Hasta q se vacio el transmit shift register
   {}
   TXSTAbits.TXEN=0;      //Deshabilito la transmicion
}



int recieve ()          //Recibe una palabra del puerto serie
{
   int a=0;
   RCSTAbits.CREN=1;      //Habilito la recepcion
      while(PIR1bits.RCIF==0)   //Espero hasta q se llene RCREG
   {
      a++;
      if (a==10000)   //time out trucho a los 0.5 seg
      {
         RCSTAbits.CREN=0;
         return 0;  
      }
   }
   RCSTAbits.CREN=0;      //Deshabilito la recepcion
   return  RCREG;
}


Muchas gracias, Niquist.

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: El u recibe mal los datos por puerto serie
« Respuesta #3 en: 21 de Febrero de 2006, 00:24:00 »
hola, podrias poner el codigo completo ya que ay funciones que usas que no son del ccs como Delay1KTCYx(123), y podrias hacer una cola de recepcion de datos y luego procesarlos cosa de no perder ninguno.

saludos.

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
RE: El u recibe mal los datos por puerto serie
« Respuesta #4 en: 21 de Febrero de 2006, 08:19:00 »
Hola,

Yo estoy haciendo el programita en el entorno de MPLAB, donde hay algunas librerias con funciones como delay() (genera una pequeña demora). Todavia no se si CCS es un entorno o q.

Probe de hacer una cola de recepcion (recibir todos los datos seguidos) y funciono. Al parecer, perdia demasiado tiempo saliendo de las subrutinas y no llegaba a ver el start bit del siguiente byte.

Muchas gracias, Niquist



 

anything