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

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

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #90 en: 19 de Enero de 2011, 12:12:25 »
Atencion:
Hago esto de aqui:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;
int cont2=0;

while(indice<6)
{

CaracterLeido = getch();
cont2++;


if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
cont1++;
}



indice++;
if (indice==2)
{
LED1=1;

}
}
LED3=1;
}


Y indice vale 2. Eso significa que con el caracter \n pasa algo raro. Que detecta que se acaba o que no lo lee bien.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #91 en: 19 de Enero de 2011, 12:18:17 »
Atencion:
Hago esto de aqui:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;
int cont2=0;

while(indice<6)
{

CaracterLeido = getch();
cont2++;


if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
cont1++;
}



indice++;
if (indice==2)
{
LED1=1;

}
}
LED3=1;
}


Y indice vale 2. Eso significa que con el caracter \n pasa algo raro. Que detecta que se acaba o que no lo lee bien.

  Pasa que como estás implementando eso, el LED1 te queda siempre prendido aunque la variable indice se siga incrementando. Porque los encendés cuando indice vale 2 pero nunca lo apagas, así aunque valga 5 va a seguir encendido
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 #92 en: 19 de Enero de 2011, 12:22:15 »
Que puedo probar Angel? Dime tu lo que crees...

Y muchas gracias por la ayuda.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #93 en: 19 de Enero de 2011, 12:24:35 »
Para contestar a lo que me has dicho en el post anterior he hecho lo siguiente:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;
int cont2=0;

while(indice<6)
{

CaracterLeido = getch();
cont2++;


if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
cont1++;
}

indice++;
if (indice==2)
LED1=1;
else
LED1=0;


}
LED3=1;
}


De esta forma ya no tendria que estar siempre encendido el led1 y SI  que lo esta. De esta forma comprobamos que el error se encuentra en quanto acaba \n

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #94 en: 19 de Enero de 2011, 12:37:07 »
Para contestar a lo que me has dicho en el post anterior he hecho lo siguiente:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;
int cont2=0;

while(indice<6)
{

CaracterLeido = getch();
cont2++;


if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
cont1++;
}

indice++;
if (indice==2)
LED1=1;
else
LED1=0;


}
LED3=1;
}


De esta forma ya no tendria que estar siempre encendido el led1 y SI  que lo esta. De esta forma comprobamos que el error se encuentra en quanto acaba \n

  Perfecta esa deducción. Lo de ese led mantenelo así.
  Yo tengo la impresión que vuelve a entrar a getch() y se queda colgado ahí. Implementa el sistema de los led pero dentro de la implementación de getch(). Encencé un LED apenas entrás y apagalo justo antes de salir.
  De esa manera, si se queda encendido sabremos que, por algún motivo se cuelga alli la función
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 #95 en: 19 de Enero de 2011, 12:49:13 »
Sigo acercandome..
mira esto:

Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;
int cont2=0;

while(indice<6)
{

CaracterLeido = getch();



if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
cont1++;
}
else
cont2++;


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



indice++;

if (cont1==2)
LED2=1;
else
LED2=0;


if (indice==2)
LED1=1;
else
LED1=0;


}
//LED3=1;
}


De aqui saco que entran dos caracteres y los dos caracteres que entran son distintos a \r y \n. Pienso yo, no puede ser que haya que expresar ese \r como 0d?

voy a probar lo que dices del getch. Que quieres que pruebe exactamente?

Código: [Seleccionar]
unsigned char getch(void)
{
 LED0=1;
while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
   
CLRWDT();
    clear_usart_errors_inline;
  }
 
return RCREG;
LED0=0;
}

Perdona pero despues de estar mas de 6h en el laboratorio ya empiezo a estar un poco espeso jejej Muchas gracias amigo.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #96 en: 19 de Enero de 2011, 13:06:50 »
Atencion a la funcion getch. He hecho lo siguiente:

Código: [Seleccionar]
unsigned char getch(void)
{
while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    
CLRWDT();
    clear_usart_errors_inline;
contador++;
  }
 
if (contador==0)
LED0=1;
else
LED0=0;
return RCREG;

}

Y contador esta a 0... es la funcion esta que parece que nunca entra en el while... no?

Edito: He declarado la variable int contador=0; arriba del todo como global y sale lo mismo.

Si quieres que haga algo mas me dices. Muchas gracias
« Última modificación: 19 de Enero de 2011, 13:11:32 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #97 en: 19 de Enero de 2011, 13:43:02 »
  Pucha, nunca me mandó la respuesta. Está lloviaendo y hay una terrible tormenta eléctrica y al parecer se me corto internet por un momento. Esto es lo que quería responderte a tu anterior mensaje.

  Bueno, si los caracteres son distintos deberían quedar almacenados en la variable que es apuntada por palabra. Creo que era la variable buffer.

  En cuanto a poner 0x0d y 0x0a en el if, en lugar de \r y \n es una prueba que no estaría de mas. Tal vez se genera algún conflicto con eso y nos estamos volviendo locos en vano.

  Con lo de getch() quiero saber si se queda colgado ahí dentro. Si el led se queda encendido es evidente que se queda allí.
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 #98 en: 19 de Enero de 2011, 13:47:42 »
Si que enciende el led con este codigo. La variable contador la declaro como global porque sino cada vez que entrara la pondria a 0, eso esta bien no?

unsigned char getch(void)
{

while (RCIF != 1) //
  {            //1 = The EUSART receive buffer, RCREG, is full
    
   CLRWDT();
    clear_usart_errors_inline;
   contador++;
  }
 
if (contador==0)
LED0=1;
else
LED0=0;

return RCREG;

}

Por otro lado, como podria ver los caracteres que se quedan dentro de buffer? He probado de debugar pero me da un  error y ese error puede ser debido a 50 causas distintas la cual no se qual puede ser. Puedo hacerlo de otra forma?

« Última modificación: 19 de Enero de 2011, 13:49:47 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #99 en: 19 de Enero de 2011, 14:19:33 »
He probado si habia algun caracter vacio con CaracterLeido=='.' y nada. Creo que el retorno de carro y el otro dato se expresan de forma diferente, no cres?
Si recibo algo que no es \n, \r y tampoco es "O" ni "K".

Ayuda por favor
« Última modificación: 19 de Enero de 2011, 15:02:22 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #100 en: 19 de Enero de 2011, 18:19:42 »
He estado debugando y he mirado que valor tiene buffer1 y he visto que vale AT!!!! ahi esta el error!! pero eso porque se produce? He cambiado la condicion del if y en vez de poner OK pongo AT y funciona perfectamente. Hay que mirar porque devuelve un AT. Ayudame por favor.
Dejo el codigo ahi, sigo mirando.

Código: [Seleccionar]

#include <htc.h>
#include <stdlib.h>  // para poder usar la funcion itoa
#include <string.h>
#include <stdio.h>
#include <conio.h>


 
__CONFIG (1, HS & CPUDIV4 & USBPLL & PLLDIV5 & FCMDIS & IESODIS); // Con 20 CPUDIV1
__CONFIG (2, BORDIS & WDTDIS & PWRTDIS);
__CONFIG (3, MCLRDIS); // estoy deshabilitando el pin de MasterClear, tal vez haya que habilitarlo, eso hay que probarlo
__CONFIG (4, LVPDIS &  DEBUGEN);
  
/* =================================================================================
Definitions
   ================================================================================= */
#define PORTBIT(adr, bit) ( (unsigned)(&adr)*8 + (bit) )
 
#define Idle_Low 1 // No envia datos
#define Idle_High 2 // Envia datos

#define true 1
#define false 0
 
#define BAUD  9600 // Configuramos la velocidad, tanto puede ser 19200 o de 9600 kbaud/s pero hay q cambiarlo tb en la simulacion de proteus
#define PIC_CLK      5000000
 
#define CS RB2

/* =================================================================================
Global variables  
   ================================================================================= */


static bit LED0 @ PORTBIT(PORTD, 0);
static bit LED1 @ PORTBIT(PORTD, 1);
static bit LED2 @ PORTBIT(PORTD, 2);
static bit LED3 @ PORTBIT(PORTD, 3);
char present_state = Idle_Low; // state variable
char future_state = Idle_Low; // state variable
unsigned int  valor_potenciometro;
unsigned int  valor_sensor_temperatura;
unsigned char pote_buf[6];
unsigned char sensor_buf[10];
char * valor_pote_en_texto;           // un puntero para almacenar el numero en texto
char * valor_sensor_en_texto;         // un puntero para almacenar el numero en texto
char byte_alto, byte_bajo;
unsigned char caracter_recibido;
unsigned char dummy;

int error_comando=1;
int error_connexion=1;
int comando_disponible=1; // No hay comando disponible
int final=1;
int prueba=1; // PRUEBA PARA SABER DONDE ESTO
char indice=0;

//CAMBIAR A 6 CON EL DISPOSITIVO
char buffer1[2];  // es 6
char * ComandoRecibido1; // este es el puntero y lo voy a usar para strcmp
char buffer2[6];  
char * ComandoRecibido2;
char buffer3[6];  
char * ComandoRecibido3;
char buffer4[6];  
char * ComandoRecibido4;
char buffer5[6];  
char * ComandoRecibido5;
char buffer6[6];  
char * ComandoRecibido6;
char buffer7[6];  
char * ComandoRecibido7;
char buffer8[6];  
char * ComandoRecibido8;
char buffer9[100];  
char * ComandoRecibido9;
char buffer10[100];  
char * ComandoRecibido10;
char buffer11[100];  
char * ComandoRecibido11;

int contador=0;

/* =================================================================================
Function prototypes
   ================================================================================= */
 
void init_system (void);
void time_delay (unsigned int );
char output_logic(void);
char future_state_logic(void);
 
void setup_sensor(void);
void setup_adc(void);
void serial_setup(void);
  
void putst(const char *str);
void putch(unsigned char c);

unsigned char getch(void);
unsigned char UsartReadChar_nonstop(void);
unsigned char getch_available(void);
unsigned char getche (void);
void clear_usart_errors(void);
 
unsigned char read_spi (void);
unsigned int read_adc(void);
 
void leer_respuesta(char * palabra);
/* =================================================================================
Main function
   ================================================================================= */
 
void main(void)
{
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 
  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();
  

 
/* =================================================================================
Establecer connexion con comandos AT
   ================================================================================= */


//Primer comando AT

ComandoRecibido1=buffer1;

putst ("AT");
putch ('\r');

time_delay(999999999);
leer_respuesta(ComandoRecibido1);

if (strcmp(ComandoRecibido1,"AT") == 0){ // Todo a ido bien
LED0=1;
LED1=1;
error_comando=0;
putst ("respuesta correcta");
putch ('\r');

}
else{                                    // No es el comando bueno
  
time_delay(999999999);
error_comando=1;
time_delay(999999999);
while(error_comando==1){
time_delay(999999999);
putst ("respuesta incorrecta");
putch ('\r');
putst ("AT");
putch ('\r');
leer_respuesta(ComandoRecibido1);



if (strcmp(ComandoRecibido1,"OK") == 0){

error_comando=0;
putst ("respuesta correcta");
putch ('\r');
}

}
}
« Última modificación: 19 de Enero de 2011, 18:26:31 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #101 en: 19 de Enero de 2011, 19:24:19 »
Estoy debugando y se queda en la linea while(RCIF!=1) de la funcion getch. Antes parecia que leia AT.. ahora no se.

Antes he llegado a ver buffer[0]='A' y buffer de 1 T. Ahora dentro de la funcion hago:

   if((CaracterLeido=='A')&&(CaracterLeido=='T'))
         cont4++;
   
   
if(cont4==0)
LED2=1;
else
LED2=1;

Y se enciende el LED2, osea que no hay ningun caracter como la A o la T...

Puede ser que el buffer sea AT si CaracterLeido nunca vale AT... menuda contradiccion...
« Última modificación: 19 de Enero de 2011, 19:39:24 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #102 en: 19 de Enero de 2011, 19:50:11 »
  Vamos a tratar de encarar la cosa desde otro ángulo.
  Por el momento descartemos un programa tan grande, hagamos uno que sólamente se comunique con el módulo bluetooth. Obviamente tendrá que tener la inicialización del puerto RS232. Pero hagamos que para leer la respuesta sólo se usen 2 veces la función getch() y se almacene el resultado en una variable.

Código: C
  1. void main ()
  2. {
  3.   char buffer[10]; // aqui se almacena la respuesta
  4.  
  5.   //inicializar el puerto serie RS232
  6.  
  7.   putst ("AT\r"); // envio el primer comando AT
  8.  
  9.   // a partir de ahora espero la respuesta, pero voy a leer solo 2 caracteres
  10.  
  11.   buffer[0] = getch();
  12.   buffer[1] = getch();
  13.  
  14.   // fin de la respuesta
  15.  
  16.  
  17.   // ahora hay que revisar que tiene almacenado la variable buffer, para saber que nos respondio el módulo
  18.  
  19.   while (1);
  20. }
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 #103 en: 19 de Enero de 2011, 20:05:19 »
Hecha la prueba. He puesto 3 leds en el paso de enviar y los dos de recibir.
La debug se queda en la funcion getch. Creo que habria que limpiar el registro RCREGporque la primera vez creo que ha entrado... y lo ha hecho todo.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #104 en: 19 de Enero de 2011, 20:16:56 »
Acuerdate que la instruccion hay que mandarla asi:
 putst ("AT"); // envio el primer comando AT
putch('\r')

Si pones el \r en el putst mete mas mierda