Autor Tema: Problema al leer una trama por RS232  (Leído 16490 veces)

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

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #90 en: 25 de Febrero de 2016, 02:40:49 »
con lo que hiciste en el programa pasaron las siguientes cosas:

antes de la modificación:

- al encender la placa electrónica comenzaba con : 0 0 0 0
- y cuando enviaba el 12&34, no pasaba nada de nada

después de la modificación:

- al encender la placa electrónica no muestra nada, todos los display  están apagados
- y cuando enviaba el 12&34, en este caso muestra :1234,
- despues que mostro los 1234, borre los datos del hércules y decidí colocar 56&78 y pulse ENTER...y no paso nada ....en definitiva solo lee la primera vez


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #91 en: 25 de Febrero de 2016, 04:12:06 »
XC8, con MPLAB. Pero ahi vas a tener que leer el datasheet del micro para configurar los modulos.

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #92 en: 25 de Febrero de 2016, 19:53:34 »
ahi me pillaste, nunca he ocupado ese copilador.....referente a la modificacion que hiciste ultimo...que se podria hacer ..para que no se bloquee

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #93 en: 25 de Febrero de 2016, 21:30:13 »
Citar
ahi me pillaste, nunca he ocupado ese copilador....

El compilador que digo es el que ofrece Microchip , el fabricante de los PIC, su IDE es el MPLAB X, que permite programar en assembler, y luego le instalas XC8 arriba para poder programar en C los PICs de 8 bits.

Citar
referente a la modificacion que hiciste ultimo...que se podria hacer ..para que no se bloquee

A que te referis con que no se bloquee?
A que siga recibiendo ?, va a seguir recibiendo pero no le va a importar nada hasta que encuentre un "enter" ( un salto de linea o un retorno de carro, el hexa de ese ASCII es 0x0A y 0x0D respectivamente. Line Feed ( '\n' ) y Carriage Return ('\r') en la imagen.

http://www.asciitable.com/index/asciifull.gif

Es decir la trama que deberias enviar desde tu pc seria asi:

"32&32\n"

el \n o \r le indica que va a comenzar una nueva trama, tambien hice que solo recibiera 5 caracteres para evitar que alguna persona pueda intentar enviar muchos caracteres y que el array se sobreescriba. Es decir intentar meter algo asi:

"32&3245&324hiaes478219dfjkl341"

En solo 5 lugares, lo cual es imposible!. Si alguien envia algo asi, solo tomaria los 5 primeros caracteres y nada mas, sino es imposible "determinar" cuando es que va comenzar el otro dato.

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #94 en: 25 de Febrero de 2016, 22:25:20 »
nuevamente gracias por responder..(estoy que me pego un balazo) :z) :z) :z) :z) :8} :8} :8} :8} jajajajajja

probe aagregando los dos tipos de (\n y \r) fin de carrera , para que sepa que comienza un nueva trama......pero igua lsi gue apareciendo solo la primera vez...despues por mas que cargue otra trama no me carga..se queda con la primera lectura.......  :cry:

esto es tan raro...tus programas son perfecto con todo el sistema de seguridad para leer datos ..pero todabia no arranca....y el programa que tengo ahora ...son mas o menos ....funciona pero lo malo que con un solo digito...demonios como quisiera que funcionara con los 4 .,....jajaja me ha dado pelea

no se que hice, pero es capas de leer a cada rato una lectura nueva del PC..pero lo malo como te he comentado anteriormente solo lee el ultimo dato del pc

pc = 12&34 --->  tarjeta ------> 0400
pc = 12&38 --->  tarjeta ------> 0800.
pc = 12&37 --->  tarjeta ------> 0700

te dejo el codigo ..por si puedes sacaralgo de esto....si me ayudas pasare hacer un pinky...ajjajjajajajja

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21.    
  22. int trama_serial[5];
  23. int x=0;
  24. #int_rda
  25.  
  26. void rda_isr(void)
  27. {
  28.    trama_serial[x]= getc();
  29. }
  30.  
  31.  void main(void){
  32.  //int8 unidad_dis1,decena_dis1,unidad_dis2,decena_dis2;
  33.  int8 unidad_1,decena_1,unidad_2,decena_2;
  34.  enable_interrupts(INT_RDA);
  35.  enable_interrupts(GLOBAL);
  36.  
  37.  while (true){
  38.  
  39.         ///////////////////////////////////////////////////
  40.         //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  41.         // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  42.         ////////////////////////////////////////////////////////////////////
  43.          unidad_1 = ((trama_serial[0])-48);   unidad_2 = ((trama_serial[3])-48);
  44.          decena_1 = ((trama_serial[1])-48);   decena_2 = ((trama_serial[4])-48);
  45.        
  46.          output_low(Display_4);// Retardo para mostrar las unidades.
  47.          output_high(Display_1);
  48.          output_a(Numeros[decena_1]);
  49.          delay_ms(1);
  50.          output_low(Display_1);// Retardo para mostrar las unidades.
  51.          output_high(Display_2);// Retardo para mostrar las unidades.
  52.          output_a(Numeros[unidad_1]);
  53.          delay_ms(1);
  54.          output_low(Display_2);
  55.          output_high(Display_3);// Retardo para mostrar las unidades.
  56.          output_a(Numeros[decena_2]);
  57.          delay_ms(1);
  58.          output_low(Display_3);// Retardo para mostrar las unidades.
  59.          output_high(Display_4);// Retardo para mostrar las unidades.
  60.          output_a(Numeros[unidad_2]);
  61.          delay_ms(1);
  62.          
  63.          
  64.    }
  65. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #95 en: 25 de Febrero de 2016, 22:43:17 »
Tu codigo solo te da un digito por que siempre estas cargando el mismo.

Código: [Seleccionar]
trama_serial[x]= getc();
x siempre es 0 , por lo tanto lo ultimo que llega se guarda en:

Código: [Seleccionar]
trama_serial[0]= getc();
quedando:
Código: [Seleccionar]
unidad_1 = ((trama_serial[0])-48);
Todo lo demas es 0, me refiero a trama_serial[1], trama_serial[2], trama_serial[3] son siempre 0  y le restas 48 cuando estan en 0!. Por eso mi if() preguntando si es mayor a 9 para ponerlo en 0.



Veo que te esta complicando demasiado la vida el tema de tener que enviar un retorno de carro, para mi que no lo estas enviando. Se me ocurren 3 cosas:

- Enviar en hexadecimal ( te dejo 3 para que hagas la prueba ):

"68&12\n" = 36 38 26 31 32 0A
"24&55\n" = 32 34 26 35 35 0A
"78&56\n" = 37 38 26 35 36 0A

Envia esos 3 valores en hexadecimal y fijate si funciona. Si funciona es por que no estas enviando el LF o CR

- Usar este codigo que no necesita del \n: ( Que al menos a mi no me gustaria, por que vas a tener errores, lo se.. intenta mandar una letra de mas y vas a ver )

Código: C
  1. #include <16f628A.H>
  2.  
  3. #fuses NOMCLR
  4. #fuses INTRC_IO
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.  
  13. #use delay (clock=4000000)
  14. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  15.  
  16. #define display_1     PIN_B4
  17. #define display_2     PIN_B5
  18. #define display_3     PIN_B6
  19. #define display_4     PIN_B7
  20.  
  21.  
  22. unsigned char trama_serial[5], buffer[5], i;
  23. int x=0;
  24. char auxiliar;
  25.  
  26.  
  27. #int_rda
  28. void rda_isr(void)
  29. {
  30.         auxiliar = getc();
  31.         if ( x < 5 )
  32.         {
  33.                 buffer[x] = auxiliar;           // En caso que sea otro tipo de valor procede a guardarlo aca
  34.                 ++x;
  35.                 if ( x == 5 )
  36.                 {
  37.                         for ( i = 0; i < 5 ; ++i )
  38.                         {
  39.                                 trama_serial[i] = buffer[i] - 48;            // Guardo en trama serial el dato completo, de esa forma no cambia mientras va recibiendo, solo cuando recibio todo
  40.                                 if (trama_serial[i] > 9 )
  41.                                 {
  42.                                         trama_serial[i] = 0;            // Proteccion por si envian cualquier caracter. Esto solo va a poner un 0 cuando no sea un numero
  43.                                 }
  44.                         }
  45.                 x=0;
  46.                 }
  47.         }
  48. }
  49.  
  50. void main(void)
  51. {
  52.  
  53.         enable_interrupts(INT_RDA);
  54.         enable_interrupts(GLOBAL);
  55.  
  56.         while (true)
  57.         {
  58.  
  59.                 ///////////////////////////////////////////////////
  60.                 //unidad_dis1 = (valor % 10);         // Se extraen las unidades.
  61.                 // decena_dis1  = (valor % 100)/10;  // Se extraen las decenas.
  62.                 ////////////////////////////////////////////////////////////////////
  63.  
  64.                
  65.                  output_low(Display_4);                 // Apago el display anterior
  66.                  output_a(trama_serial[0]);             // Pongo el dato mientras estan todos apagados asi no se ve el cambio
  67.                  output_high(Display_1);                // Activo el display
  68.                  delay_ms(1);                           // Muestro
  69.                  output_low(Display_1);
  70.                  output_a(trama_serial[1]);
  71.                  output_high(Display_2);
  72.                  delay_ms(1);
  73.                  output_low(Display_2);
  74.                  output_a(trama_serial[3]);
  75.                  output_high(Display_3);
  76.                  delay_ms(1);
  77.                  output_low(Display_3);
  78.                  output_a(trama_serial[4]);
  79.                  output_high(Display_4);
  80.                  delay_ms(1);
  81.         }
  82. }

Este ultimo codigo es igual, nomas que ahora toma los 5 que llegaron los procesa y los guarda. Y automaticamente agarra los 5 nuevos que viene.

- Cambiar el formato de la trama a otra parecida, supongamos asi:

"a12&37"

Esto va a permitir esperar la "a" para saber cuando comienza la trama de nuevo ( es lo mismo que el \n , nomas que esta ves estoy usando algo que podes poner en el teclado facilmente)
Lo bueno de esto, es que ademas podes definir varios "tipos" de tramas segun la letra inicial. Suponete:

"b1237" ---------- Lo mismo que a12&37 pero esta ves sin el &, con la b sabemos que 2 son del primero y 2 del segundo
"c123&456" ------ Lo mismo que antes, pero con la c, esperamos esta ves 3 digitos por cada uno y separados por un &
"d123456"  ------- Lo mismo que ocurriria con la b, pero esta ves para valroes de 3 digitos y sin &.
"e12"  ------------- Cambiar unicamente los 2 primeros digitos
"f32" -------------- Cambiar unicamente los 2 ultimos digitos.

ETC, es una idea esta nomas.
« Última modificación: 25 de Febrero de 2016, 22:52:09 por KILLERJC »

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #96 en: 25 de Febrero de 2016, 23:10:25 »
gracias amigo, probare todo lo que me has comentado ahora.......haber si me resulta ...te comento como me va

a mi me dieron la misión de leer la trama = 45&56, por eso pongo enfasis con ese caracter &, no es por que a mi se me  antoje...y como dices tu vendra con un fin de carrera que me indique que termina la trama...tienes toda la razon...si que seguire probando lo que me dices

saludos

Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Problema al leer una trama por RS232
« Respuesta #97 en: 25 de Febrero de 2016, 23:52:54 »
probe recien este ejemplo que me enviastey paso lo siguiente

ejemplo de la trama a:-
"Cambiar el formato de la trama a otra parecida, supongamos asi:

"a12&36"
cargo el dato, y después coloco enter siempre cargando el mismo dato

1° ENTER : 0103
2° ENTER : 8020
3° ENTER : 3812
4° ENTER : 0301
5° ENTER : 1238   <------ dato correcto, despues de 5 enter

nota : se supone que cada vez que cargue el dato siempre deberia haber sido 1238
_______________________________________________________________________________

y con la otra prueba también mejoro la lectura, pero también debo darle barios enter para que aparezca el valor correcto

32 34 26 35 35 0A = "68&12\n", aparece ese valores después de varios enter..pero responde bien a la lectura pero aparecen numeros que no tienen nada que ver....


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #98 en: 26 de Febrero de 2016, 00:13:54 »
No entiendo.... Ya hay 2 codigos, el que te pase antes que deberias probar lo de enviar hexadecimal ( el que toma en cuenta el '\n' )

Probaste enviando el hexadecimal ( sin enter ), tilda abajo la casilla "hex" pone el valor

32 34 26 35 35 0A

Y presiona "Send", te deberia aparecer ( 24 55 ) luego pone otro valor

36 38 26 31 32 0A

y presiona "Send" de nuevo, y deberias ver 68 12.

Sino en modo "ASCII"  ( sin tildar el hex )

24&55$0A
68&12$0A

Citar
To sent data to the device press send button on the right of the respective field or use F1, F2, F3 respectively for the first, second and third field. Check the HEX box to send hex characters (used to send NVT commands). The ASCII characters are sent by typing #xxx (where x is a number in 0...9), $yy (where y is a hex number) or for example for line feed or for carriage return. To send the character #, $ or < type ##, $$ and << respectively.

------------------------------------------------------------------

Respecto a cambiar la trama tenes que cambiar el programa yo no lo hice, eso era una 3ra opcion.
El programa que pase al ultimo solo recibe datos y no tenes que enviar ningun enter, le quite exactamente lo del enter para que no tengas problemas, es decir deberias enviar:

12&3645&8934&98

Y si envias eso sin ningun enter ( todo junto ), primero mostraria 12 36, a medida que seguis escribiendo deberia aparecerte 45 89

Lo que no se es si el Hercules esta enviando algun otro valor ( tal como CR o LF ), en las imagenes que mostras no aparecen, pero me da a dudar que lo hace.

--------------------------------------

El primer programa que te pase, que toma en cuenta los enter, no deberia afectar el valor cuando presionas enter, para nada, ya que lo unico que hace es poner a 0 el indice, es decir por mas que presiones 100 veces enter y no envies teclas ni nada no cambiaria el valor para nada.

Lo que me molesta es no saber que esta enviando el Hercules, es decir si envia el \r o \n, pero aun asi lo tome en cuenta a ambos y no deberia afectar.


 

anything