Autor Tema: Comunicacion conviene en ASCI ?  (Leído 2096 veces)

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

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Comunicacion conviene en ASCI ?
« en: 26 de Noviembre de 2011, 20:15:07 »
Amigos, hoy se me planteo una duda....

A la hora de comunicarme entre dos dispositivos, conviene enviarme los datos en formato asci?  Es decir

Por Ejemplo, quiero enviar un valor (255)

Lo envio en un solo byte como 1111111
o lo envio en 3 bytes como  "2" "5" "5"    ?

Se me hace que con el primer ejemplo se me puede llegar a confundir un inicio de trama, fin de trama o checksum con algun otro dato que quiera enviar no ???


En caso de usar el 2do metodo,  con convierto un dato=255 en tres datos ASCI ??? 2 5 5  ??


SALUDOS !!!



Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comunicacion conviene en ASCI ?
« Respuesta #1 en: 26 de Noviembre de 2011, 21:00:55 »
lo mas logico es usar los menos bytes posibles para que la comunicacion sea mas rapida, ademas te ahorras el tener que convertir un string en un int si lo que necesitas son trabajar con numeros.

Lo de que se puede confundir con inicio de trama, fin de trama... no se a que te refieres, supongo que lo diras porque de la primera forma puedes usar cualquier numero desde 0 hasta 255, y de la otra forma solo utilizas el rango ascii numerico, asi si pones un caracter raro como inicio o fin de trama no lo confundirias, no?
Yo no me preocuparia por esto, si haces un buen codigo no te tiene porque pasar, ademas con el cheksum podras comprobar que la trama esta bien o mal.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Comunicacion conviene en ASCI ?
« Respuesta #2 en: 26 de Noviembre de 2011, 21:15:29 »
La unica ventaja de usar comunicacion serial en ASCII es que puedes hacer debug en la linea de comunicacion en forma sencilla.
El problema de usarlo, como dice Merlinz es que es mas ineficiente que hacerlo en hexadecimal.
Si las tramas no son muy largas, usalo tranquilo.
Eso si, tendras que usar algun tipo de checksum para detectar errores.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Comunicacion conviene en ASCI ?
« Respuesta #3 en: 26 de Noviembre de 2011, 21:21:02 »
lo mas logico es usar los menos bytes posibles para que la comunicacion sea mas rapida, ademas te ahorras el tener que convertir un string en un int si lo que necesitas son trabajar con numeros.

Lo de que se puede confundir con inicio de trama, fin de trama... no se a que te refieres, supongo que lo diras porque de la primera forma puedes usar cualquier numero desde 0 hasta 255, y de la otra forma solo utilizas el rango ascii numerico, asi si pones un caracter raro como inicio o fin de trama no lo confundirias, no?
Yo no me preocuparia por esto, si haces un buen codigo no te tiene porque pasar, ademas con el cheksum podras comprobar que la trama esta bien o mal.

Muchas gracias !


Claro, si yo elijo un comando para inicio de trama, por ejemplo 254 decimal....   y dentro de mi trama van valores decimales y uno de ellos es 254, lo puedo llegar a confundir con uninicio de trama..  Como puedo evitar eso?

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Comunicacion conviene en ASCI ?
« Respuesta #4 en: 27 de Noviembre de 2011, 01:19:21 »
Esta es una buena respuesta:
si haces un buen codigo no te tiene porque pasar, ademas con el cheksum podras comprobar que la trama esta bien o mal.

Si admites cualquier valor asci, existe la posibilidad de que el marcador de inicio de trama aparezca dentro de los datos o incluso que coincida con el código de verificación de error o parte de este, pero en este caso el código de verificación que calculas sera incorrecto (puede darse la remota posibilidad de que coincida, pero puedes aplicar el algoritmo del avestruz en este caso :oops: -disculpen).

Si tienes un código de verificación de error que puede ser calculado antes de la llegada de un nuevo dato, con un buffer circular del mismo tamaño de la trama, puedes detectar ese error y no descartar todos los datos del buffer y buscar dentro de este el posible inicio de la siguiente trama. En función de la complejidad de tu proyecto optaras por utilizar un recurso como este o mas elaborado... o bien capturas tramas y verificas que son correctas (la mayor parte de las veces).

Espero que sea de utilidad.
@fabianjsm is on twitter

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comunicacion conviene en ASCI ?
« Respuesta #5 en: 27 de Noviembre de 2011, 05:01:17 »
yo en mi codigo lo puse de la siguiente forma:
el primer dato que recibe lo compara con X numero de inicio de trama, si corresponde activa una variable de que los demas datos que reciba seran una trama (tamaño, datos, final de trama....). A su vez activo un timer el cual si en 1s la trama se queda atascada, por ejemplo si el tamaño han sido 8bytes y solo ha recibido 7, o bien no se recibe final de trama esa trama se descarta, se pone la variable a 0, y puedes hacer que se envie un dato como error de recepcion y se vuelva a iniciar la trama (yo esto no lo puse).

Aunque volviese a aparacer un dato con el mismo inicio de trama no pasaria nada, ya que lo interpretaria como datos, al estar la variable=1 hasta que no se ponga a 0 no volver a hacer una comprobacion de inicio de trama.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Comunicacion conviene en ASCI ?
« Respuesta #6 en: 28 de Noviembre de 2011, 21:54:37 »
En base a sus consejos he creado este codigo, a ver que les parece..

Saludos !!


Código: C
  1. const int8 iniciodetrama        =       0xff;
  2. const int8 ACK                  =       0xfe;
  3. const int8 ID                   =       1;
  4. const int8 lenbuffer            =       10;
  5.  
  6. int8 i;
  7. int8 buffer[lenbuffer];
  8.  
  9. int8 dato=0,recibido=0, analizatrama=0,timeout=0, lentrama=0, checksum=0;
  10.  
  11.  
  12. #int_RDA
  13. void  RDA_isr(void)
  14. {
  15. clear_interrupt(int_rda);
  16.         if(kbhit()){
  17.                 dato=getc();
  18.                 recibido=1;
  19.         }
  20. }
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28. while(1){
  29.  
  30.         if(recibido){                                                           //hay un dato recibido?
  31.                 if(dato==iniciodetrama&&analizatrama==0){                       //es un caracter de inicio de trama?
  32.                         analizatrama=1;                                         //flag que indica que hay que analizar una trama
  33.                         timeout=0;                                             
  34.                         set_timer0(0);
  35.                         clear_interrupt(int_timer0);
  36.                         enable_interrupts(INT_TIMER0);                          //encendemos un timer para timeout
  37.                         lentrama=0;                    
  38.                         i=0;                                                    //ponemos en 0 indice
  39.                 }
  40.  
  41.                 buffer[i]=dato;                                                 //guarda dato en buffer
  42.                 ++i;++lentrama;
  43.                 if(i>lenbuffer){i=0;analizatrama=0;buffer[0]=0;}
  44.                 else if(timeout==0 && lentrama>2&& analizatrama==1 && buffer[0]==iniciodetrama && buffer[1]==ID&&lentrama==buffer[2]){
  45.                         i=0;analizatrama=0;
  46.                         checksum=0;
  47.                         for(i=0;i<lentrama;i++){
  48.                         checksum^=buffer[i-1];
  49.                         }
  50.                         if(checksum==buffer[lentrama-1]){
  51.                                 DELAY_MS(200);
  52.                                 printf("ACK");
  53.                         }
  54.                 }
  55.                 recibido=0;
  56.         }
  57.  
  58. }

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Comunicacion conviene en ASCI ?
« Respuesta #7 en: 29 de Noviembre de 2011, 02:13:55 »
Buen trabajo, felicitaciones!
@fabianjsm is on twitter

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Comunicacion conviene en ASCI ?
« Respuesta #8 en: 29 de Noviembre de 2011, 10:01:53 »
Gracias Fabian !

Alguien le cambiaría algo? les parece un buen codigo con checksum?

Saludos !

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comunicacion conviene en ASCI ?
« Respuesta #9 en: 29 de Noviembre de 2011, 16:36:24 »
El francho:
          Una duda. Vos mandas como 1er dato de la trama el iniciodetrama
Como 2 dato el id. Y como 3 dato ¿ lentrama?

                     
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Comunicacion conviene en ASCI ?
« Respuesta #10 en: 29 de Noviembre de 2011, 20:23:43 »
El francho:
          Una duda. Vos mandas como 1er dato de la trama el iniciodetrama
Como 2 dato el id. Y como 3 dato ¿ lentrama?

                     


Claro, como no tengo un comando que me indique FIN DE TRAMA, lo que hago es mandar en 3er lugar la longitud de la trama.  De esta manera el receptor sabrá Cuando ya es hora analizar dicha trama...

A ver si algún capo de los pic nos dice si esto esta bien ?

Saludos !!!!


 

anything