Autor Tema: Como hacer un bufer de recepcion  (Leído 4191 veces)

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

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Como hacer un bufer de recepcion
« en: 04 de Mayo de 2011, 19:03:44 »
a ver e buscado y leido t releido en el foro pero no logro entender como hacer un buffer de recepcion para puerto serial... tengo un pic que me envia serialmente el valor de la temperatura tomada por un lm35
PIC TX

Código: [Seleccionar]
char temp
.....
.....
hacemos todo los del CAD y tenemos el valor de la temperatura y la envio serialmente al otro PIC
putc(0xff);
 putc(temp);

aja mi si uso un cable para comunicar ambos PIC no hay problema... el problema es que quiero hacerlo inalambricamente pero necesito emplaer un buffer de recpcion para capturar el dato valido y no cualquier dato o ruido

PIC RX

Código: [Seleccionar]
#use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7)
char temp1=' ';
#int_rda
void serial_isr() {
    temp1=0x00;
   if(kbhit()){
         temp1=getch();
         printf("\r\n%d ",temp1); // envia la temperatura serialmente
         lcd_gotoxy(8,1);
         printf(lcd_putc,"\fT=%d",temp1);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
         delay_ms(100);
}


hasta ahi funciona bien usando como medio de trasnmisio el cable... pero cuando paso a RF no me funciona...

quiero es hacer un buffer en donde primero guarde la trama y pregunte si esta presente el dato 0xff que es mi comienzo de trama para poder decir que es un dato valido....

e visto en el foro que dicen algo asi:

int i=0;
char buffer[8]=;
luego guardan y empiezan a hacer un bucle para comparar los primero bits si son correctos.... que alguien si puede me explique mas de este temaaa  :-/


Kamus de Acuario

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Como hacer un bufer de recepcion
« Respuesta #1 en: 04 de Mayo de 2011, 20:44:35 »
como la comunicación es unidireccional, entonces solo tienes una opción: detectar y enganchar correctamente la trama de entre tantas que llegan.

una idea podría ser que a la trama que coloques un encabezado y un fin de trama (puede ser un carácter que no tenga relación con los datos que quieres transmitir).

siguiendo la idea, y mirando el código que Subió Diego :

http://www.todopic.com.ar/foros/index.php?topic=4573.0

el pic procesará los datos de byte en byte


Código: [Seleccionar]
#int_rda
void serial_isr() {                    // Interrupción recepción serie USART
 if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
   }
}

luego en addbuff

void Add_buffrec(char c){                         // Añade caracter al Buffer de Recepcion
     if c==xxxx{
     // aqui va el codigo que corresponde al fin de trama
        disable_interrupts(int_rda);
     }
     if c==yyy
     // aqui va el codigo que corresponde al inicio de trama
     bandera=1 //activa el procesamiento de captura de datos
    }
    if bandera==1{
         buffrec[xbuffrec++]=c;               // Añade caracter recibido al Buffer
    }
}
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como hacer un bufer de recepcion
« Respuesta #2 en: 04 de Mayo de 2011, 22:01:35 »
Aprovechando que tienes un microcontrolador de ambos lados, puedes agregarle a la trama un CheckSum como para determinar que los datos recibidos son validos.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Como hacer un bufer de recepcion
« Respuesta #3 en: 05 de Mayo de 2011, 11:13:59 »
Kamus23:
              Para ver sobre lo que explica Suky  de CheckSum
podés ver aquí :
http://www.todopic.com.ar/foros/index.php?topic=25627.msg209598#msg209598
           Allí BrunoF de manera muy clara enseña cómo realizar un CRC para diversos dispositivos.
          Saludos.
                Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: Como hacer un bufer de recepcion
« Respuesta #4 en: 09 de Mayo de 2011, 00:02:13 »
graciasssss jejeje estoy en fases de prueba con el buffer, apenas tenga resultados les comento..
y con respecto al checksum mmm me parece muy buena idea... leere el articulo del CRC a ver si comprendo como usarlo...
Kamus de Acuario

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como hacer un bufer de recepcion
« Respuesta #5 en: 09 de Mayo de 2011, 10:39:14 »
y con respecto al checksum mmm me parece muy buena idea... leere el articulo del CRC a ver si comprendo como usarlo...

Un CheckSum sencillo que utilizan por ejemplo los GPS es:

Código: C
  1. CheckSum=0;
  2. for(k=0;k<10;k++){
  3.        CheckSum^=Trama[k];
  4. }

Con eso ya tienes 1 byte para controlar si la data recibida es la misma que el transmisor envío o paso algo  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: Como hacer un bufer de recepcion
« Respuesta #6 en: 09 de Mayo de 2011, 15:32:35 »
jejejej ya hice la prueba con el ejemplo de buffer que me facilito el pana palitroqueZ, solo tengo algunos detallitos que corregir... ya que logro recibir el dato correcto, pero no logro desabilitar y habilitar la interrupcion serial para esperar un nuevo dato.. ahi les dejo el codigo

Código: [Seleccionar]
// CONSTANTES /////////////////////////////////////////////////////////////////

int const lenbuff=32;                  // Longitud de buffer, Ajustar
                                       // a lo que desees (o te sea posible)

// VARIABLES EN RAM ///////////////////////////////////////////////////////////

int  xbuffrec=0x00;                       // Índice: siguiente char en cbuff
char buffrec[lenbuff];                   // Buffer
char rcvchar=0x00;                     // último caracter recibido
int1 bandera=0;                    // Flag para indicar comando disponible
char x=0x00;
char fin=0x00;
void  addcbuff(char c);                 // añade caracter recibido al buffer

#int_rda
void serial_isr() {                    // Interrupción recepción serie USART
 if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
      rcvchar=0;
   }
}

void addcbuff(char c){ // Añade caracter al Buffer de Recepcion
     if (c==0x22){
     // aqui va el codigo que corresponde al fin de trama
     fin=c;
        putc(x);
        bandera=0;}
      if (c==0x21){
     // aqui va el codigo que corresponde al inicio de trama
     bandera=1; //activa el procesamiento de captura de datos
    }
    if (bandera==1){
        x= buffrec[xbuffrec++]=c;               // Añade caracter recibido al Buffer
}
}
void main(){
setup_adc_ports(NO_ANALOGS); //puerto ADIGITALES
lcd_init();                       //INICIALIZA EL LCD
set_tris_a(0x01);
enable_interrupts(global);
enable_interrupts(int_rda);
 do{
 if(fin==0x22){
 lcd_putc("\fCONTROL TEMPERATURA"); //IMPRIME EN PANTALLA
lcd_gotoxy(7,2);                  //COLOCA EL CURSOR EN COLUMNA 7 FILA 2
printf(lcd_putc,"T=%d",x); //muestro el dato en la LCD en decimal
 delay_ms(500);
 }
}while(1);

 }
       

cuando hablamos de este ejemplo de ceckSum, que significa  ^=  ????
      CheckSum=0;
      for(k=0;k<10;k++){
            CheckSum^=Trama[k];
      } 
Kamus de Acuario

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como hacer un bufer de recepcion
« Respuesta #7 en: 09 de Mayo de 2011, 16:31:32 »
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.
No contesto mensajes privados, las consultas en el foro

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
Re: Como hacer un bufer de recepcion
« Respuesta #8 en: 09 de Mayo de 2011, 23:01:31 »
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.

mmmm sep jejeje se que es un operador de C, pero es un Or exclusivo?? me puedes decir que es lo que hace en si? gracias
Kamus de Acuario

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como hacer un bufer de recepcion
« Respuesta #9 en: 10 de Mayo de 2011, 10:02:12 »
Citar
^  ->  Bitwise exclusive or operator

Es un operador de C.

mmmm sep jejeje se que es un operador de C, pero es un Or exclusivo?? me puedes decir que es lo que hace en si? gracias

Si es or exclusivo bit a bit. En wikipedia puedes ver una tabla de verdad


Saludos
No contesto mensajes privados, las consultas en el foro


 

anything