Autor Tema: Error al comparar dos strings con strcmp  (Leído 42594 veces)

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #105 en: 19 de Enero de 2011, 20:55:00 »
  Sí, tenés razón, eso era a raíz de los if que estaban en la implementación de putst.

  Estoy leyendo el datasheet del PIC16F877 -en lo referente al UART- y dice que si se setea el bit OERR se puede leer dos veces el registro RCREG para obtener los valores que allí se hayan almacenados. Luego sí hay que borrar el bit OERR de la manera que está implementado en la función getch() (que sería con el uso de "clear_usart_errors_inline").

  No sé porque, pero me parece que por ahí podría venir el error.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #106 en: 19 de Enero de 2011, 20:57:11 »
Yo he pensado lo mismo del registro RCREG. He visto que hay que borrar el valor poniendo a 0 el bit RCIF... prueba a ver con eso que dices o con esto que te digo. Yo seguire probando por otros sitios.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #107 en: 19 de Enero de 2011, 21:01:34 »
Yo he pensado lo mismo del registro RCREG. He visto que hay que borrar el valor poniendo a 0 el bit RCIF... prueba a ver con eso que dices o con esto que te digo. Yo seguire probando por otros sitios.

  Es que el bit RCIF sólo se borra cuando se vacía el registro RCREG.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #108 en: 20 de Enero de 2011, 00:07:12 »
  Armé en proteus una simulación del módulo. Puse un PIC16F628 (U1) como si fuera el micro que estás queriendo programar. Y también puse un PIC16F628 (U2) como si fuese el módulo Bluetooth. De esta manera U1 envía el comando ATS y es U2 quien se encarga de dar la respuesta que debería dar el modulo.

 Este es el programa que está corriendo en U1

Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3. #include "Def16f62xa.h"
  4.  
  5. __CONFIG (LVPDIS & WDTDIS & MCLRDIS);
  6.  
  7.  
  8. #define BRGH_VALUE 1
  9. #define PIC_CLK 10000000
  10. #define BAUD 9600
  11.  
  12. #include "HardUart16.c"
  13.  
  14. char Respuesta[10];
  15.  
  16. void LeerRespuesta (char * mensaje)
  17. {
  18.   char CaracterLeido;
  19.  
  20.   getch();
  21.   getch();
  22.   do
  23.   {
  24.     CaracterLeido = getch();
  25.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  26.     {
  27.       *mensaje = CaracterLeido;
  28.       *mensaje++;
  29.     }
  30.     *mensaje = '\0';
  31.   }
  32.   while (CaracterLeido != '\n');
  33. }
  34.  
  35.  
  36. void main(void)
  37. {
  38.  
  39.   setup_comparator (NC_NC_NC_NC);
  40.   TRISA = 0;
  41.   TRISB = 255;
  42.   InitHardUart (TRANSMIT | RECEIVE);
  43.   putst ("ATS");
  44.   putch ('\r');
  45.   LeerRespuesta (Respuesta);
  46.   while (1);
  47. }

  Este es el programa que está corriendo en el supuesto módulo

Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3. #include "Def16f62xa.h"
  4.  
  5. __CONFIG (LVPDIS & WDTDIS & MCLRDIS);
  6.  
  7.  
  8. #define BRGH_VALUE 1
  9. #define PIC_CLK 10000000
  10. #define BAUD 9600
  11.  
  12. #include "HardUart16.c"
  13.  
  14. char Comando[10];
  15.  
  16. void LeerPuerto (char * mensaje)
  17. {
  18.   char CaracterLeido;
  19.  
  20.   do
  21.   {
  22.     CaracterLeido = getch();
  23.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  24.     {
  25.       *mensaje = CaracterLeido;
  26.       *mensaje++;
  27.     }
  28.     *mensaje = '\0';
  29.   }
  30.   while (CaracterLeido != '\r');
  31. // evaluo respecto de \r porque el comando que me manda el micro debe terminar con CarrierReturn
  32. }
  33.  
  34.  
  35. void main(void)
  36. {
  37.  
  38.   setup_comparator (NC_NC_NC_NC);
  39.   TRISA = 0;
  40.   TRISB = 255;
  41.   InitHardUart (TRANSMIT | RECEIVE);
  42.  
  43.   while (1)
  44.   {
  45.     LeerPuerto (Comando);
  46.     putch ('\r');
  47.     putch ('\n');
  48.     if (strcmp (Comando, "AT") == 0) putst ("OK");
  49.     else
  50.       putst ("ERROR");
  51.  
  52. // si el comando es AT devuelvo OK sino devuelvo ERROR
  53.  
  54.     putch ('\r');
  55.     putch ('\n');
  56.   }
  57. }

  También adjunto una captura. Como puede apreciarse en la misma, la variable "Respuesta" que está en U1 toma el valor "ERROR", ya que el comando que le mandé es "ATS" esto se ve en la variable "Comando" de U2
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #109 en: 20 de Enero de 2011, 04:43:56 »
No entiendo nada... sigue sin salir amigo..
Tengo este codigo ahora mismo:

Código: [Seleccionar]
void main ()
{
  char buffer[10]; // aqui se almacena la respuesta
  
 
  //inicializar el puerto serie RS2326.
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 
  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();

 putst ("AT"); // envio el primer comando AT
putch('\r');
LED0=1;
 
 LeerRespuesta (Respuesta);
LED1=1;

if (strcmp (Respuesta, "OK") == 0)
LED2=1;
else
LED3=1;



  while (1);
}

Código: [Seleccionar]
void LeerRespuesta (char * mensaje)
{
  char CaracterLeido;
 
  getch();
  getch();
  do
  {
    CaracterLeido = getch();
    if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
    {
      *mensaje = CaracterLeido;
      *mensaje++;
    }
    *mensaje = '\0';
  }
  while (CaracterLeido != '\n');
}

Cuando debugo no se si lo hago bien pero se queda en el while del getch
Animo va, que hay que sacarlo! Muchas gracias.
« Última modificación: 20 de Enero de 2011, 05:30:38 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #110 en: 20 de Enero de 2011, 05:10:26 »
En el primer getch de la funcion ( antes del segundo getch y por lo tanto antes del if) hay un bucle infinito en el while(RCIF!=1). RCIF es siempre diferente a 1

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #111 en: 20 de Enero de 2011, 08:06:01 »
Hola! He ido a ver un profesor que domina la materia y me ha dicho que lo hacemos mal.

Primero hay que hacer una funcion para leer TODO el contenido de lo que recibimos y despues en otra quitar los caracteres. De esta forma iremos un poco mas lentos pero se puede atajar mejor el problema.

Que te parece? Ayudame a hacerlas si acaso.. voy a subir lo que he hecho.

Una funcion para leer todo lo que se recibe:
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int i=0;
int cont=0;

char buffer_todos_caracteres[6];

while(indice<6){
*mensaje=getche();
cont++;
}

if(cont==0)
LED3=1;
else
LED3=0;

indice++;
}

Y otra para quedarme solo con  "O" y "K"
Código: [Seleccionar]
void SacarCaracteres (char buffer_todos_caracteres) //Sacamos los caracteres recibidos en falso
{
int i=0;
char buffer_caracteres_buenos[2];

while(i<5){
if(buffer_todos_caracteres[i]=='O'){
buffer_caracteres_buenos[0]=buffer_todos_caracteres[i];
}
else if (buffer_todos_caracteres[i]=='K')
buffer_caracteres_buenos[1]=buffer_todos_caracteres[i];
i++;
}  

}

De momento la de leer no da ningun error pero no logro leer por la funcion getche o getch (lo mismo). Es mas, se queda en la linia clear_usart_errors_inline;
donde tu pensabas que estaba el error... a ver si descubrimos que pasa.

Ayudame por favor


Muchas gracias.
« Última modificación: 20 de Enero de 2011, 09:36:09 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #112 en: 20 de Enero de 2011, 09:48:17 »
  No entiendo porque hay que leer todos los caracteres de entrada, pero bueno supongamos que haciendo eso no falle.

  Tus funciones están mal. En la implementación de "Leer_Respuesta" estás declarando una variable "char buffer_todos_caracteres[6]", pero nunca la usás. Después, en la función "SacarCaracteres" definís la variable "char buffer_caracteres_buenos[2]" y lo trabajás pero en ningún momento retornas dicho valor. Y por otro lado, sólo le das una dimensión de 2 pero si tu dispositivo te devuleve un mensaje de error que ocupe más te vas a perder varios caracteres.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #113 en: 20 de Enero de 2011, 09:51:27 »
Primero quiero ser capaz de leer lo que viene. Estoy con la funcion "Sacar(...)" comentada. La funcion de leer crees que esta bien asi?
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int i=0;
int cont=0;

while(indice<6){
*mensaje=getch();
cont++;
}

if(cont==0)
LED3=1;
else
LED3=0;

indice++;
}


Creo que no vas desencaminado cuando dices que falla el cleart_usart... a ver si encontramos que pasa. Muchas gracias por ayudarme tanto en esto, la verdad es que no se que esta pasando.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #114 en: 20 de Enero de 2011, 09:54:51 »
Estoy debugando.. y a veces si que sale de la funcion pero a la siguiente iteracion se queda dentro.

unsigned char getch(void)
{

while (RCIF != 1) //
  {            //1 = The EUSART receive buffer, RCREG, is full
   clear_usart_errors_inline;
   CLRWDT();
  }

return RCREG;
}

Cuando debugo el cursor va del while a la linia de clear_usart.. y de esta al }( antes del return).
Por lo que nunca se para a hacer el CLRWGT a lo mejor porque como es una funcion interna.. ya no entra.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #115 en: 20 de Enero de 2011, 10:12:13 »
  Sigue estando mal. Tenés declarada la variable i pero nunca la usas y por otro lado te falta poner *mensaje++ para que lo que vas leyendo se vaya almacenando sucesivamente. Asi como está implementada hasta ahora siempre vas a almacenar el caracter leído, en el mismo lugar.

  Ojo! con lo que estés debuggeando porque por ejemplo en el proteus si el programa tiene varias sentencias en un solo renglón (como es el caso de clear_usart_errors_inline) salta a cualquier lado. Para que no pase eso, yo he probado de dejar varios espacios hasta la próxima sentencia. Y sino, mejor aún, en lugar de dejar clear_usart_errors_inline poné todo lo que forma parte de ese define.

  Algo así...

Código: C
  1. char getch()
  2. {
  3.   while (RCIF == 0)
  4.   {
  5.     if (OERR == 1)
  6.     {
  7.       if (TXEN == 1)
  8.       {
  9.         TXEN=0;
  10.         TXEN=1;
  11.       }
  12.       if (CREN == 1)
  13.       {
  14.         CREN=0;
  15.         CREN=1;
  16.       }
  17.     }
  18.  
  19.     if (FERR == 1)
  20.     {
  21.       dummy = RCREG;
  22.       if (TXEN == 1)
  23.       {
  24.         TXEN=0;
  25.         TXEN=1;
  26.       }
  27.     }
  28.     CLRWDT();
  29.   }
  30.   return RCREG;
  31. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #116 en: 20 de Enero de 2011, 10:22:59 »
Osea sustituyo la otra funcion por este codigo que has puesto o como?

Por otro lado, no estoy debugando con el proteus, estoy con el modulo conectado al pic y debugando asi.


Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #117 en: 20 de Enero de 2011, 10:33:47 »
Gracias por la ayuda de nuevo.
Entonces la funcion de sacar..:
 
Código: [Seleccionar]
void SacarCaracteres (char buffer_todos_caracteres) //Sacamos los caracteres recibidos en falso
{
int i=0;
char buffer_caracteres[7];


while(i<8){
if(buffer_todos_caracteres[i]=='O'){
buffer_caracteres[0]=buffer_todos_caracteres[i];
}
else if (buffer_todos_caracteres[i]=='K')
buffer_caracteres[1]=buffer_todos_caracteres[i];

else
buffer_caracteres[i]=buffer_todos_caracteres[i];

i++;


}

Me salen errores en casi todas por no decir todas las sentencias buffer_caracteres=buffer_todos_caracteres. Me sale el error "pointed required".. como lo pongo?

Y por otro lado, como devuelvo el buffer? imagino que haciendo el return del pointer...


Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #118 en: 20 de Enero de 2011, 10:37:44 »
Estoy probando la nueva funcion getch. Ha salido y a aumentado el cont 2 veces creo pero ahora se ha metido en el while(RCIF==0) y no entra en ninguno de los if. Va saltando de while a if (del OERR) a if(del FERR) y vuelve a empezar...

Edito: El problema esta en que RCIF siempre es 0. Y eso porque puede pasar..? eso es lo que hay que pensar bien. No entiendo como el buffer puede estar vacio..

Edito1: Me acabo de acordar que en serial_setup tengo la definicion del cleart_errors_usart.. la comento para que no afecte al desarrollo del programa?
« Última modificación: 20 de Enero de 2011, 10:54:30 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #119 en: 20 de Enero de 2011, 10:55:29 »
Estoy probando la nueva funcion getch. Ha salido y a aumentado el cont 2 veces creo pero ahora se ha metido en el while(RCIF==0) y no entra en ninguno de los if. Va saltando de while a if (del OERR) a if(del FERR) y vuelve a empezar...

Edito: El problema esta en que RCIF siempre es 0. Y eso porque puede pasar..? eso es lo que hay que pensar bien. No entiendo como el buffer puede estar vacio..

  Ni yo tampoco.
  Lo único que me ocurre por pensar es que en algún momento sí se active el bit FERR y entonces entre a dicho if, allí dentro en la sentencia "dummy = RCREG" se borre justamente el registro y ya no se llene más. Pero tampoco tiene mucho sentido eso porque supuestamente el dispositivo sigue enviando caracteres.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything