TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cvargcal 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.
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.
-
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.
-
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?...
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.
-
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?...
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ó.
-
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