Autor Tema: Tamaño del buffer de recepción  (Leído 3157 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Tamaño del buffer de recepción
« en: 24 de Junio de 2015, 03:11:26 »
Saludos, tengo una duda con respecto al tamaño del buffer de recepción:
tengo el siguiente código y uso el micro 18F26K22.

Código: [Seleccionar]
int const lenbuff=255;
char buffer1[lenbuff];                  // Buffer1 UART1
char buffer2[lenbuff];                  // Buffer1 UART2
int  xbuff1=0x00;                       // Índice: siguiente char en buffer1
int  xbuff2=0x00;                       //

#int_RDA                                                 //
void RDA_isr1(void) {                                    // Interrupción recepción serie USART
   c=0x00;                                               // Inicializo carácter recibido                    
   if(kbhit(uart1)){                                     // Si hay algo pendiente de recibir ...
      c=getc(uart1);                                     // lo descargo y ...
       switch(c){                                        //
         case 0x0D: flagcommand1=1; break;               // Enter -> Habilita Flag para procesar Comando en Main
         default:  
                    if(xbuff1==lenbuff) xbuff1=0x00;     // Si buffer esta lleno se resetea
                    buffer1[xbuff1++]=c;                 // Añade caracter recibido al Buffer          
      }
   }
}

se supone que cuando sobrepase el valor 255, no hay problema con el overflow... pero no siempre es así,
aveces si funciona y aveces no... en la mayoría de los casos no hay problemas...
Mi duda es, se supone que es un pic de 8bit, osea que el valor máximo debe ser de 255.
eso aplica para el tamaño del buffer, es decir no puedo tener un buffer de 500?

Gracias.
« Última modificación: 24 de Junio de 2015, 03:14:59 por cvargcal »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re: Tamaño del buffer de recepción
« Respuesta #1 en: 24 de Junio de 2015, 03:54:34 »
Saludos, tengo una duda con respecto al tamaño del buffer de recepción:
tengo el siguiente código y uso el micro 18F26K22.

Creo que con declarar variables con int16, puedo extender el buffer a 500... almenos simulado funciona.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Tamaño del buffer de recepción
« Respuesta #2 en: 24 de Junio de 2015, 04:53:54 »
Exactamente no entendi cual era tu duda.

Desde la UART solo podes recibir un byte, asi que es de 0x00 a 0xFF el valor recibido y a guardar.

Ahora el tamaño del "buffer", array que creas, eso depende un poco de la memoria del micro. Y tambien de los compiladores, por ejemplo XC8 cuando pasa una cierta cantidad te pide que modifiques un poco demasiado a mi gusto el archivo del linker.
Es decir podes hacer

char buffer1[9999999999] si es que tu compilador lo soporta y tenes espacio en el micro, por razones obvias uno no posee tal cantidad de memoria y como dije por ahi los compiladores tiran la bronca
tambien xbuff1 si llega a 255 deberia ocurrir un overlfow y quedar en 0 al incrementarse nuevamente, con lo cual:

buffer1[xbuff1++]=c;

bastaria...
me baso todo en supuestos, ya que no se si el compilador agregara algo mas (que uno no sabe) podria ocurrir algo disinto. Si hace lo que se le dice entonces deberia ser asi.
Todavia no entiendo por que un buffer TAN grande


Otra pregunta que se me cruza respecto al codigo (aunque lo estes usando de ejemplo) es por que usarlo asi?...

Citar
int const lenbuff=255;

Esto significa que esa constante se guarde en la flash, y cada ves que se necesite comparar con algo tenga que leerse de la misma.
Si haces

#define LENBUFF 255

Es distinto ya que se reemplazaria directamente en el codigo, la mayuscula es solo una convencion de las constantes.


Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re: Tamaño del buffer de recepción
« Respuesta #3 en: 24 de Junio de 2015, 10:36:57 »
Exactamente no entendi cual era tu duda.

Desde la UART solo podes recibir un byte, asi que es de 0x00 a 0xFF el valor recibido y a guardar.

Ahora el tamaño del "buffer", array que creas, eso depende un poco de la memoria del micro. Y tambien de los compiladores, por ejemplo XC8 cuando pasa una cierta cantidad te pide que modifiques un poco demasiado a mi gusto el archivo del linker.
Es decir podes hacer

char buffer1[9999999999] si es que tu compilador lo soporta y tenes espacio en el micro, por razones obvias uno no posee tal cantidad de memoria y como dije por ahi los compiladores tiran la bronca
tambien xbuff1 si llega a 255 deberia ocurrir un overlfow y quedar en 0 al incrementarse nuevamente, con lo cual:

buffer1[xbuff1++]=c;

bastaria...
me baso todo en supuestos, ya que no se si el compilador agregara algo mas (que uno no sabe) podria ocurrir algo disinto. Si hace lo que se le dice entonces deberia ser asi.
Todavia no entiendo por que un buffer TAN grande


Otra pregunta que se me cruza respecto al codigo (aunque lo estes usando de ejemplo) es por que usarlo asi?...

Citar
int const lenbuff=255;

Esto significa que esa constante se guarde en la flash, y cada ves que se necesite comparar con algo tenga que leerse de la misma.
Si haces

#define LENBUFF 255

Es distinto ya que se reemplazaria directamente en el codigo, la mayuscula es solo una convencion de las constantes.


Hola, muchas gracias por comentar,
Resulta que necesito una trama de datos muyyy larga ( 300 caracteres) es por esa razón  un buffer[500] seria perfecto.
pero ahora lo conseguí definiendo las variables como "int16".
Uso el compilador es CCS y este ejemplo lo descargue de picmania... intentaré hacer lo que recomiendas.
¿hay problemas si el buffer es tan grande?, en este momento estoy separando los datos en 2, pero quiero que todo vaya en un solo envió.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Tamaño del buffer de recepción
« Respuesta #4 en: 24 de Junio de 2015, 16:03:46 »
Como te dije, desde el punto de vista de aplicacion no es problema.
Podes tener un buffer que abarque la cantidad de memoria que tiene tu micro.

Es decir si tu buffer es de 300, entonces necesitara 300 bytes.

El PIC18 tiene una memoria que podriamos llamarle lineal, si esta separada en bancos, pero no es que se tienen registros entre medio.
Distinto el PIC16 que si lo tiene y requiere algunas funciones y reserva de memoria para hacerlo.

Pero creo que no deberias tener problemas al elegir el tamaño de buffer en ese PIC.
Como bien decis, define a 16bis xbuff