• Sábado 21 de Diciembre de 2024, 11:28

Autor Tema:  Problemas Con El Serial  (Leído 1799 veces)

picmaniaco

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas Con El Serial
« en: Sábado 23 de Diciembre de 2006, 18:17 »
0
:huh: EStoy haciendo comunicacion serial en la Pc con Visual y en el microcontrolador (Pic16f877) en C(css) y todo va bien pero en cierto momento el micro deja de recibir datos no hay interrupciones de puerto serial no se que pasa alguien me pusiese ayudar

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Problemas Con El Serial
« Respuesta #1 en: Domingo 24 de Diciembre de 2006, 14:26 »
0
Lo ideal es crearte un buffer de recepcion de unos 50 byte tipo char bufferRdx[50];  y luego asignar la recepcion de datos a la interrupcion de recepcion  dentro de esta interrupcion vas guardando los datos recibidos en el buffer e incrementando un contador con tope hasta  el tamaño del buffer .
Fuera de la funcion de recepcion lees el contador si es distinto de cero sacas datos del buffer y restas el numero de datos sacados al contador.

En codigo serial algo asi:

Código: Text
  1.  
  2.  
  3. //Variables Globales
  4.  
  5. char rdxUartbuffer[50];
  6. char rdxUartcounter;
  7. char *prdxUartpointer;
  8.  
  9.  
  10. //Prototipos
  11.  
  12. #separate void UartResetBuffer(void);
  13. #separate char UartLenBuffer(void);
  14. #separate signed char UartReadChar(void);
  15.  
  16.  
  17. //Funciones
  18.  
  19. //Reset Buffer Rdx
  20.  
  21. #separate void UartResetBuffer(void)
  22. {
  23.  rdxUartbuffer[0] = 0;
  24.  prdxUartpointer = rdxUartbuffer;
  25.  rdxUartcounter = 0;
  26. }
  27.  
  28. //Informa cuantos datos estan esperando en el buffer USO OPCIONAL
  29.  
  30. #separate char UartLenBuffer(void)
  31. {
  32.  return rdxUartcounter;
  33. }
  34.  
  35. //Lee datos del buffer
  36.  
  37. #separate signed char UartReadChar(void)
  38. {
  39.  signed char temp;
  40.  
  41.  if(rdxUartcounter)
  42.    {
  43.     temp = (signed char) rdxUartbuffer[0];
  44.     memcpy(rdxUartbuffer,rdxUartbuffer+1,sizeof(rdxUartbuffer));
  45.     prdxUartpointer--;
  46.     rdxUartcounter--;
  47.    }
  48.  else
  49.       {
  50.         UartResetBuffer();
  51.         return -1; // no hay mas datos
  52.       }
  53.  return temp;
  54. }
  55.  
  56.  
  57. // Control Interrupcion RDX
  58. #INT_RDA
  59. void UartRdxHandle(void)
  60. {
  61.  char temp;
  62.  
  63.  temp = getc();
  64.  if(rdxUartcounter < sizeof(rdxUartbuffer))
  65.    {
  66.      *prdxUartpointer = temp;
  67.      prdxUartpointer++;
  68.      rdxUartcounter++;
  69.    }
  70. }
  71.  
  72.  
  73.  
  74. //Principal
  75.  
  76. void main (void)
  77. {
  78.   UartResetBuffer();
  79.   enable_interrupts(INT_RDA);
  80.   enable_interrupts(GLOBAL);
  81.  
  82.  //bla..blabla resto de tu codigo
  83.  
  84. }
  85.  
  86.  
  87.  
  88.