Autor Tema: Consulta verificacion trama recibida  (Leído 2032 veces)

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

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Consulta verificacion trama recibida
« en: 26 de Septiembre de 2011, 15:24:59 »
Uso C18 con PIC18F, quiero comparar una trama recibida via RS232 con una cadena fija pero tengo error de compilacion :

char Cadena_a_Comparar[]="";

En la interrupción tengo:

Código: C
  1. if (PIR1bits.RCIF==1)           //RCIF==1 : Byte USART recibido
  2.         {
  3.                 PIR1bits.RCIF=0;
  4.                 trama[i] = getcUSART();
  5. //Si la trama termina en [0D][0A] aviso al main que ha llegado una nueva trama:
  6.                 if ( trama[i-1]==0x0D && trama[i]==0x0A )
  7.                 {
  8.                         Aux1.NuevaTrama=1;
  9.                 }
  10.                 else
  11.                 {
  12.                         i++;
  13.                         Aux1.NuevaTrama=0;
  14.                 }
  15.         }

En el main tengo:
...
Código: C
  1. while(1)
  2. {
  3.         while ( Aux1.NuevaTrama==0 ){};
  4.         Compara_Trama('abrir');//aqui va la cadena a comparar (abrir) con la trama que ha llegado
  5.         i=0;            //Reseteo i:
  6.         trama[0]=0;     //Reinicio la cadena
  7.         Aux1.NuevaTrama=0;
  8. }

...

Código: C
  1. void Compara_Trama(char Cadena_a_Comparar)
  2. {
  3.         for     (j=0;j<strlen(Cadena_a_Comparar);j++)
  4.         {
  5.                 if(     trama[j]==Cadena_a_Comparar[j]  )
  6.                 {
  7.                 //Comparación correcta, se recibió la cadena "abrir"
  8.                         Aux1.FlgCmpTrama=1;
  9.  
  10.                 }
  11.                 else
  12.                 {
  13.                         Aux1.FlgCmpTrama=0;
  14.                         break;  //salgo del for
  15.                 }
  16.         }
  17. }

Me sale error de compilación, donde puede estar mi falla?
« Última modificación: 26 de Septiembre de 2011, 15:33:38 por Suky, Razón: Se coloca código entre [ code ] [ /code ] »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Consulta verificacion trama recibida
« Respuesta #1 en: 26 de Septiembre de 2011, 15:36:14 »
Jelou!

1º C18 normalmente te indica la línea dónde tienes la "cagada".

2º "abrir" es un define (macro)? Si no es así: ' ' se utiliza para caracteres " " para strings...

1 saludo
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Consulta verificacion trama recibida
« Respuesta #2 en: 26 de Septiembre de 2011, 15:38:01 »
Al colocar Cadena_a_Comparar[] no estas asignando un espacio de memoria al buffer, seguramente es 1 char. Debes fijar un tamaño, por ejemplo Cadena_a_Comparar[10].

Para cargar el buffer con datos podes usar memcpypgm2ram(...) o directamente comparar con strcmppgm2ram(...). Detalles en C:\MCC18\doc\hlpC18Lib.chm


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Re: Consulta verificacion trama recibida
« Respuesta #3 en: 26 de Septiembre de 2011, 16:03:25 »
Si en vez de 'abrir' uso "abrir" me sale "Warning [2054] suspicious pointer conversion" indicando como lineas de warnig las que figura "Compara_Trama" y luego sale un error "Error [1129] [] operator requires a pointer and an integer as operands" apuntando a la funcion "Compara_Trama".

Intento lo otro, para comparar 2 cadenas definen strcmppgm2ram asi: signed char strcmppgm2ram(const char * str1, const rom char * str2 );

En mi caso he definido:

char Cad1[]="abrir";

y escribo:

while(1)
{
   while ( Aux1.NuevaTrama==0 ){};
   strcmppgm2ram(const char * trama,const rom char * Cad1);
   i=0;      //Reseteo i:
   trama[0]=0;   //Reinicio la cadena
   Aux1.NuevaTrama=0;
}

pero me sale error de sintaxis.

tambien he definido asi:
   strcmppgm2ram(const char * trama,"abrrir");
pero tambien me sale error

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Consulta verificacion trama recibida
« Respuesta #4 en: 26 de Septiembre de 2011, 16:06:37 »
 :shock:

Tendrías que leer algún libro o tutorial de C para practicar desde cero  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Consulta verificacion trama recibida
« Respuesta #5 en: 26 de Septiembre de 2011, 16:16:57 »
Estoy con suky: echale un ojillo a algún manual de C18 o ANSI C...XD.

1º No puedes llamar a una función especificando el tipo (   "strcmppgm2ram(const char * trama,const rom char * Cad1);" ).
char Cad1[]="abrir"; declara una cadena. Tienes que pasar un puntero, no la cadena.... Repasate los punteros.

1 saludo

Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Re: Consulta verificacion trama recibida
« Respuesta #6 en: 27 de Septiembre de 2011, 14:54:01 »
Gracias por sus aportes ayer tuve que leer hasta de amanecida hasta hoy y emtendi mejor las cosas, tengo poco tiempo para leer pero valió la pena, entendí lo basico de hecho me falta mucho mas pero obtuve lo que necesitaba, adjunto el codigo por si alguien le interese o alguna sugerencia quizas:

while(1)
{
//Espero hasta que llegue una nueva trama:
   while ( Aux1.NuevaTrama==0 ){};
   Aux1.NuevaTrama=0;//borro flag

/*La función "strstrrampgm" busca una cadena (arr_abrir) dentro de otra (trama), pero esta función necesita como argumentos las direcciones en donde se encuentran dichas cadenas involucradas, es decir, necesita como argumento los punteros de las respectivas cadenas y son:
*/
   ptr_abrir=&arr_abrir[0]; //Apunto a "arr_abrir"
   ptr_trama=&trama[0]; //Apunto a "trama"

/*Ahora busco la cadena que apunta "ptr_abrir" dentro de la cadena que apunta "ptr_trama" asi:
*/
   ptr_busca=strstrrampgm(ptr_trama,ptr_abrir);

/////////

/*La función devuelve como resultado un puntero el cual apunta al inicio de la cadena encontrada por eso en la declaración de variables defino asi:
*/

char *ptr_busca;

//ademas defino tambien:

const rom char arr_abrir[11]="abrir";/* esta es la cadena que necesito buscar en la trama y se encuentra en la memoria de programa en forma de tabla */

rom char *ptr_abrir; /* defino el puntero tambien como rom char porque debe ser del mismo tipo del array*/

char trama[40]=""; /* aqui almaceno la trama recibida */
char *ptr_trama; /* este es el puntero a la trama  */

////////

Continuando en el main, luego de la linea "ptr_busca=strstrrampgm(ptr_trama,ptr_abrir);" sigue:

   if(ptr_busca!=0)//Si el puntero devuelto no es nulo es porque se encontró la cadena
   {
   //se encontró la cadena!
   }
   i=0;      //Reseteo i:
   trama[0]=0;   //Reinicio la cadena
}

Bueno espero le haya servido a alguien y disculpen si vuelvo a hacer alguna consulta por ahi, los resultados como ven los detallo para que le sirva a alguien es como un agradecimiento a las personas que me dan una mano aunque en realidad de mucho no les ayuda porque ya saben todo esto y mas pero quiero aportar lo poco que aprendo. Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Consulta verificacion trama recibida
« Respuesta #7 en: 27 de Septiembre de 2011, 15:54:38 »
Muy bien! Es importante aprender a resolver los problemas solo  ;-) No hay nada que el estudio no pueda resolver  :)


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


 

anything