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

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

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #180 en: 21 de Enero de 2011, 18:35:56 »
No me vuelve a funcionar la primera palabra.. no se si porque he cambiado el nombre de variables y alguna se me ha pasado pero creo que no es por eso. Ya he estado hechandole un ojo y no veo nada raro joder.. dejo el codigo a ver si ves algo.
Código: [Seleccionar]
void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

char primera_respuesta[9];
char primer_ok[10];


register const char *ComandoIdeal = "OK";
register const char  *ComandoRecibido1;


int i=0;

  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();


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

//Primer comando AT
putst ("AT"); // Desconnectar el echo.
putch ('\r');

primera_respuesta[0] = getch();
primera_respuesta[1] = getch();
primera_respuesta[2] = getch();
primera_respuesta[3] = getch();
primera_respuesta[4] = getch();
primera_respuesta[5] = getch();
primera_respuesta[6] = getch();
primera_respuesta[7] = getch();
primera_respuesta[8] = getch();


//while(1);
while(i<9)
{
if(primera_respuesta[i]=='O')
{
primer_ok[0]=primera_respuesta[i];
}
if(primera_respuesta[i]=='K')
{
primer_ok[1]=primera_respuesta[i];
}
i++;
}

ComandoRecibido1=primer_ok;
if (strcmp(ComandoRecibido1,ComandoIdeal) == 0){ // Todo a ido bien
while(1);
error_comando=0;
}
else{                                    // No es el comando bueno
while(1);
error_comando=1;

while(error_comando==1){
putst ("AT");
putch ('\r');

primera_respuesta[0] = getch();
primera_respuesta[1] = getch();
primera_respuesta[2] = getch();
primera_respuesta[3] = getch();
primera_respuesta[4] = getch();
primera_respuesta[5] = getch();
primera_respuesta[6] = getch();
primera_respuesta[7] = getch();
primera_respuesta[8] = getch();



while(i<9)
{
if(primera_respuesta[i]=='O')
{
primer_ok[0]=primera_respuesta[i];
}
if(primera_respuesta[i]=='K')
{
primer_ok[1]=primera_respuesta[i];
}
i++;
}

if (strcmp(ComandoRecibido1,ComandoIdeal) == 0)
error_comando=0;


}
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #181 en: 21 de Enero de 2011, 18:55:11 »
  A ver... en este código estás queriendo guardar la primera_respuesta con 9 getch() sucesivos. ¿Estás seguro que el modulo te manda 9 caracteres? porque de no ser así te vas a quedar colgado ahí.

  Por tal motivo hay que tratar de implementar la función (la última que subí funciona bien) ya que en la función no se espera un número determinado de caracteres sino que una vez que llega el \n ya termina.
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 #182 en: 21 de Enero de 2011, 18:57:23 »
Entonces como lo hago? indicame que pongo exactamente..
Lo raro es que funcionaba antes..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #183 en: 21 de Enero de 2011, 19:00:59 »
Entonces como lo hago? indicame que pongo exactamente..
Lo raro es que funcionaba antes..

  Funcionaba porque justamente ponías la cantidad justa de getch();
  ¿Porque no mirás el código que yo subí? Donde está implementada la función "LeerRespuesta" que encima como está implementada ya te devuelve sólo lo que interesa de la respuesta, (siempre y cuando el módulo no te retorne lo que vos le envias), es decir que dicha función si tu módulo te retorna \r\nOK\r\n sólo almacena en la variable la cadena OK
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 #184 en: 21 de Enero de 2011, 19:04:13 »
Es que el modulo tiene que enviar lo que envia sino es un follon. Intento hacerlo de esta forma, debo haber tocado el valor de algun buffer.. a ver si puedes verlo. Leo bien los dos buffers.

Código: [Seleccionar]

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


//#conio.h, e #iostream.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;

/*
char buffer1[6];  // 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;
char buffer_caracteres[7];

*/



/* =================================================================================
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);

void clear_usart_errors(void);
 
unsigned char read_spi (void);
unsigned int read_adc(void);


unsigned char getch(void);



/* =================================================================================
Main function
  ================================================================================= */
 

 

void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

char Respuesta[9];
char ok[3];


register const char *ComandoIdeal = "OK";
register const char  *ComandoRecibido1;


int i=0;

  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();


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

//Primer comando AT
putst ("AT"); // Desconnectar el echo.
putch ('\r');

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();
Respuesta[6] = getch();
Respuesta[7] = getch();
Respuesta[8] = getch();


//while(1);
while(i<9)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}

ComandoRecibido1=ok;
if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
while(1);
error_comando=0;
}
else{                                    // No es el comando bueno
while(1);
error_comando=1;

while(error_comando==1){

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

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();
Respuesta[6] = getch();
Respuesta[7] = getch();
Respuesta[8] = getch();



while(i<9)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}

if (strcmp(ComandoRecibido1,ComandoIdeal) == 0)
error_comando=0;


}
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #185 en: 21 de Enero de 2011, 19:16:58 »
Es que el modulo tiene que enviar lo que envia sino es un follon. Intento hacerlo de esta forma, debo haber tocado el valor de algun buffer.. a ver si puedes verlo. Leo bien los dos buffers.


  Ya sé que tiene que envíar lo que envía. Pero podés estudiar como implementé "LeerRespuesta" y hacer las modificaciones necesarias.


Código: [Seleccionar]

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


//#conio.h, e #iostream.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;

/*
char buffer1[6];  // 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;
char buffer_caracteres[7];

*/



/* =================================================================================
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);

void clear_usart_errors(void);
 
unsigned char read_spi (void);
unsigned int read_adc(void);


unsigned char getch(void);



/* =================================================================================
Main function
  ================================================================================= */
 

 

void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

char Respuesta[9];
char ok[3];


register const char *ComandoIdeal = "OK";
register const char  *ComandoRecibido1;


int i=0;

  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();


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

//Primer comando AT
putst ("AT"); // Desconnectar el echo.
putch ('\r');

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();
Respuesta[6] = getch();
Respuesta[7] = getch();
Respuesta[8] = getch();


//while(1);
while(i<9)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}

ComandoRecibido1=ok;
if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
while(1);
error_comando=0;
}
else{                                    // No es el comando bueno
while(1);
error_comando=1;

while(error_comando==1){

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

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();
Respuesta[6] = getch();
Respuesta[7] = getch();
Respuesta[8] = getch();



while(i<9)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}

if (strcmp(ComandoRecibido1,ComandoIdeal) == 0)
error_comando=0;


}
}

  Sinceramente no noto que haya diferencia, sólo veo cambiado el nombre de una variable que en uno de tus ejemplos se llamaba primer_ok y ahora se llama ok.

  Así como está, ¿Que valor queda almacenado en la variable Respuesta? Teniendo en cuenta que están los while ubicados después de strcmp y que el programa va a quedar colgado ahí, Respuesta va a corresponder con la primer respuesta del módulo
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 #186 en: 21 de Enero de 2011, 20:15:37 »
Yasta arreglado, estoy haciendo el comando 2..
Es un poco engorroso pero es la mejor opcion creo. Es raro porque en el buffer me guarda OOK cuando le pongo esto:

Código: [Seleccionar]
while(j<9)
{
if(Respuesta2[j]=='O')
{
ok2[0]=Respuesta2[j];


}
if(Respuesta2[j]=='K')
{
ok2[1]=Respuesta2[j];

}

if(Respuesta2[j-1]=='K')
{
ok2[2]='\0';
}

j++;
}

No estoy forzando mucho para que todo funcione bien? es imposible que pase eso... Habria que hacerla mas robusta
« Última modificación: 21 de Enero de 2011, 20:18:38 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #187 en: 21 de Enero de 2011, 22:37:19 »
Bueno ya tengo esto casi funcionando. Los comandos AT funcionan todos menos uno que no me da un error:

putst (""AT+BTK="1234"");

Como el numero ( que es el PIN de la conexion) va entre " tira un error ya que esta al lado de los otros que son para encerrar la expresion.



Por otro lado, ahora que lo de los comandos AT ya esta falta lo ultimo del proyecto. Hay que esperar tres mensajes: de emparejamiento, y dos mas para la connexion. Dejo aqui un poco la idea principal:

Código: [Seleccionar]
//Una condicion para saber que ya ha acabado de hacer los comandos AT
{
// Hay que esperar a recibir los mensajes y para eso hay que ir leyendo el buffer


// El otro dispositivo se quiere connectar con nosotros.
//Mensaje de aparejamiento : "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23


//Mensaje de llamada: "RING 008098E6A5F4 (17 caracteres)" +4 =21


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4

Que se te ocurre? voy a dormir yo.. que ya es muy tarde.

Muchas gracias por la ayuda.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #188 en: 21 de Enero de 2011, 23:13:19 »
Bueno ya tengo esto casi funcionando. Los comandos AT funcionan todos menos uno que no me da un error:

putst (""AT+BTK="1234"");

Como el numero ( que es el PIN de la conexion) va entre " tira un error ya que esta al lado de los otros que son para encerrar la expresion.


  Para solucionar ese inconveniente basta con ponerlo así..

Código: C
  1. putst ("AT+BTK=");// AT+BTK=
  2. putch ('"');      // "
  3. putst ("1234");   // 1234
  4. putch ('"');      // "
  5. putch ('\r');     // \r

EDITO, sino también sirve esto....

Código: C
  1. putst ("AT+BTK=\"1234\"");
  2. putch ('\r');

  Prestar atención a que las comillas ( " ) que serán enviadas están precedidas por la barra ( \ ) de igual manera que los caracteres correspondientes a CarrierReturn ( \r ) y LineFeed ( \n ).

Bueno ya tengo esto casi funcionando. Los comandos AT funcionan todos menos uno que no me da un error:

putst (""AT+BTK="1234"");

Como el numero ( que es el PIN de la conexion) va entre " tira un error ya que esta al lado de los otros que son para encerrar la expresion.



Por otro lado, ahora que lo de los comandos AT ya esta falta lo ultimo del proyecto. Hay que esperar tres mensajes: de emparejamiento, y dos mas para la connexion. Dejo aqui un poco la idea principal:

Código: [Seleccionar]
//Una condicion para saber que ya ha acabado de hacer los comandos AT
{
// Hay que esperar a recibir los mensajes y para eso hay que ir leyendo el buffer


// El otro dispositivo se quiere connectar con nosotros.
//Mensaje de aparejamiento : "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23


//Mensaje de llamada: "RING 008098E6A5F4 (17 caracteres)" +4 =21


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4

Que se te ocurre? voy a dormir yo.. que ya es muy tarde.

Muchas gracias por la ayuda.

  Cuando en cada uno de esos mensajes te referís a + 4 caracteres, ¿Serían los \r\n del comienzo y el final de la respuesta?
  Justamente lo que hace mi función LeerRespuesta es discriminar dichos caracteres por lo tanto se obtendría en limpio el mensaje que nos interesa.
« Última modificación: 21 de Enero de 2011, 23:22:28 por AngelGris »
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 #189 en: 22 de Enero de 2011, 07:33:12 »
Si, me refiero a esos que dices. He hecho lo siguiente ( con tu funcion) y me sale un error comun en las tres veces que la he utilizado
"illegal conversion between pointer types" en la linia que asigno hago ComandoRecibido=ok..

Código: [Seleccionar]
//*****************************************************************************
//MENSAJE DE APAREJAMIENTO: "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23
//*****************************************************************************     

ComandoRecibido9=ok9;
LeerRespuesta(ComandoRecibido9);

//while(1);


if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}


//*****************************************************************************
//MENSAJE DE LLAMADA: "RING 008098E6A5F4 (17 caracteres)" +4 =21
//*****************************************************************************     

ComandoRecibido10=ok10;
LeerRespuesta(ComandoRecibido10);

//while(1);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}



//*****************************************************************************
//MENSAJE DE CONEXION: CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4
//*****************************************************************************     

ComandoRecibido11=ok11;
LeerRespuesta(ComandoRecibido11);

//while(1);


if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}

Por otro lado.. me sale un error que si que me preocupa un poco.. ayer me caduco la version del Hitech y la volvi a bajar. La tengo en mode PRO(o eso creo) y ahora con tanto vector.. me tira dos errores de espacio..

Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.65\sources\ftneg.c; 20. could not find space (341 bytes) for auto/param block
Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.65\sources\lwmod.c; 21. could not find space (341 bytes) for auto/param block

Por favor, ayudame
Muchas gracias de antemano, como siempre :)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #190 en: 22 de Enero de 2011, 10:06:41 »
Si, me refiero a esos que dices. He hecho lo siguiente ( con tu funcion) y me sale un error comun en las tres veces que la he utilizado
"illegal conversion between pointer types" en la linia que asigno hago ComandoRecibido=ok..

Código: [Seleccionar]
//*****************************************************************************
//MENSAJE DE APAREJAMIENTO: "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23
//*****************************************************************************     

ComandoRecibido9=ok9;
LeerRespuesta(ComandoRecibido9);

//while(1);


if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}


//*****************************************************************************
//MENSAJE DE LLAMADA: "RING 008098E6A5F4 (17 caracteres)" +4 =21
//*****************************************************************************     

ComandoRecibido10=ok10;
LeerRespuesta(ComandoRecibido10);

//while(1);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}



//*****************************************************************************
//MENSAJE DE CONEXION: CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4
//*****************************************************************************     

ComandoRecibido11=ok11;
LeerRespuesta(ComandoRecibido11);

//while(1);


if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}


  A la función hay que pasarle un array como parámetro. Fijate en el ejemplo que yo subí que le paso la variable "RespuestaConFunción" que está definida, dentro del main, como "char RespuestaConFuncion[10]". En tu caso tendría que ser una array lo suficientemente grande como para que te entren todos los caracteres.


Por otro lado.. me sale un error que si que me preocupa un poco.. ayer me caduco la version del Hitech y la volvi a bajar. La tengo en mode PRO(o eso creo) y ahora con tanto vector.. me tira dos errores de espacio..

Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.65\sources\ftneg.c; 20. could not find space (341 bytes) for auto/param block
Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.65\sources\lwmod.c; 21. could not find space (341 bytes) for auto/param block

Por favor, ayudame
Muchas gracias de antemano, como siempre :)

  Puede ser que al tener demasiadas variables declaradas como arrays grandes te vayas quedando sin espacio. Pero no estoy seguro. ¿Por qué no declarás una sola y la vas usando en las sucesivas lecturas de las respuestas?

  También puede ser un mensaje erróneo del compilador.
  A mi, cuando caducó la licencia me empezó a tirar un error extraño en un parámetro al linker que jamás le estaba pasando. (ese era el problemita que había tenido con el compilador). Yo estoy usando linux así que no tengo un registro que limpiar, pero me puse a buscar y encontré un archivo oculto que se llamaba "htsoft.xml" y adentro tenía algo referente a las key de los compiladores tanto para PIC18 como para PIC16. Borré dicho archivo y ya no tuve más el mensaje de error.

  Tal vez en tu caso convenga desinstalar el compilador, limpiar el registro de windows (el ccleaner es un programa que funciona muy bien para ello) y luego volver a instalar el compilador.
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 #191 en: 22 de Enero de 2011, 10:22:03 »
Gracias de nuevo. Perdon, no me fije bien como iba la funcion Respuesta. Entonces esa funcion es capaz de quedarse con los mensajes:

PAIR 0 008098E6A5F4
RING 008098E6A5F
CONNECT 008098E6A5F4,1101 A

Porque veo que se acaba cuando hay un \n. Habria que modificarla no?

Por otro lado, ahora ya solo me aparecen esos errores por lo del espacio. Creo que es porque uso muchos vectores, hechale un vistazo al codigo:
Código: [Seleccionar]

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


//#conio.h, e #iostream.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 final=1;
int prueba=1; // PRUEBA PARA SABER DONDE ESTO
char indice=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);

void clear_usart_errors(void);
 
unsigned char read_spi (void);
unsigned int read_adc(void);


unsigned char getch(void);
char * LeerRespuesta(char * mensaje);



/* =================================================================================
Main function
  ================================================================================= */
 
void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

char Respuesta1[12];
char ok1[3]; // ES FIJO!!
register const char  *ComandoRecibido1;

char Respuesta2[13];
char ok2[3]; // ES FIJO!!
register const char  *ComandoRecibido2;

char Respuesta3[15];
char ok3[3]; // ES FIJO!!
register const char  *ComandoRecibido3;

char Respuesta4[15];
char ok4[3]; // ES FIJO!!
register const char  *ComandoRecibido4;

char Respuesta5[15];
char ok5[3]; // ES FIJO!!
register const char  *ComandoRecibido5;

char Respuesta6[20];
char ok6[3]; // ES FIJO!!
register const char  *ComandoRecibido6;

char Respuesta7[11];
char ok7[3]; // ES FIJO!!
register const char  *ComandoRecibido7;

char Respuesta8[10];
char ok8[3]; // ES FIJO!!
register const char  *ComandoRecibido8;


char Respuesta9[23];
char ok9[19]; // OJO aqui son 19 caracteres + 4
register const char  *ComandoRecibido9;

char Respuesta10[21];
char ok10[17]; // OJO aqui son 19 caracteres + 4
register const char  *ComandoRecibido10;

char Respuesta11[31];
char ok11[27]; // OJO aqui son 19 caracteres + 4
register const char  *ComandoRecibido11;


register const char *ComandoIdeal = "OK";


int i=0;
int j=0;
int z=0;
int v=0;
int w=0;
int q=0;
int t=0;
int d=0;

 
init_system();
setup_sensor();
setup_adc();
serial_setup();


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



//*****************************************************************************
//PRIMER COMANDO AT
//*****************************************************************************
putst ("AT"); // Desconnectar el echo.
putch ('\r');

Respuesta1[0] = getch();
Respuesta1[1] = getch();
Respuesta1[2] = getch();
Respuesta1[3] = getch();
Respuesta1[4] = getch();
Respuesta1[5] = getch();
Respuesta1[6] = getch();
Respuesta1[7] = getch();
Respuesta1[8] = getch();



while(i<9)
{
if(Respuesta1[i]=='O')
{
ok1[0]=Respuesta1[i];

}
if(Respuesta1[i]=='K')
{
ok1[1]=Respuesta1[i];
}

if(Respuesta1[i-1]=='K')
{
ok1[2]='\0';
}

i++;
}

ComandoRecibido1=ok1;
if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;
}







//*****************************************************************************
//SEGUNDO COMANDO AT
//*****************************************************************************

putst ("ATS0=1"); // Desconnectar el echo.
putch ('\r');

Respuesta2[0] = getch();
Respuesta2[1] = getch();
Respuesta2[2] = getch();
Respuesta2[3] = getch();
Respuesta2[4] = getch();
Respuesta2[5] = getch();
Respuesta2[6] = getch();
Respuesta2[7] = getch();
Respuesta2[8] = getch();
Respuesta2[9] = getch();
Respuesta2[10] = getch();
Respuesta2[11] = getch();
Respuesta2[12] = getch();


while(j<13) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta2[j]=='O')
{
ok2[0]=Respuesta2[j];

}
if(Respuesta2[j]=='K')
{
ok2[1]=Respuesta2[j];

}
if(Respuesta2[j-1]=='K')
{
ok2[2]='\0';
}
j++;
}
//while(1);

ComandoRecibido2=ok2;
if (strcmp(ComandoRecibido2,"OK") == 0){ // Todo a ido bien
// while(1);
LED1=1;
error_comando=0;

}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}









//*****************************************************************************
//TERCER COMANDO AT
//*****************************************************************************

putst ("ATS512=4"); // Desconnectar el echo.
putch ('\r');

Respuesta3[0] = getch();
Respuesta3[1] = getch();
Respuesta3[2] = getch();
Respuesta3[3] = getch();
Respuesta3[4] = getch();
Respuesta3[5] = getch();
Respuesta3[6] = getch();
Respuesta3[7] = getch();
Respuesta3[8] = getch();
Respuesta3[9] = getch();
Respuesta3[10] = getch();
Respuesta3[11] = getch();
Respuesta3[12] = getch();
Respuesta3[13] = getch();
Respuesta3[14] = getch();


while(z<15)
{
if(Respuesta3[z]=='O')
{
ok3[0]=Respuesta3[z];

}
if(Respuesta3[z]=='K')
{
ok3[1]=Respuesta3[z];

}
if(Respuesta3[z-1]=='K')
{
ok3[2]='\0';
}
z++; // CAMBIAR
}
//while(1);

ComandoRecibido3=ok3;
if (strcmp(ComandoRecibido3,"OK") == 0){ // Todo a ido bien
//while(1);
LED2=1;
error_comando=0;

}
else{                                    // No es el comando bueno
//while(1);
error_comando=1;

}






//*****************************************************************************
//QUARTO COMANDO AT
//*****************************************************************************

putst ("ATS502=1"); // Desconnectar el echo.
putch ('\r');

Respuesta4[0] = getch();
Respuesta4[1] = getch();
Respuesta4[2] = getch();
Respuesta4[3] = getch();
Respuesta4[4] = getch();
Respuesta4[5] = getch();
Respuesta4[6] = getch();
Respuesta4[7] = getch();
Respuesta4[8] = getch();
Respuesta4[9] = getch();
Respuesta4[10] = getch();
Respuesta4[11] = getch();
Respuesta4[12] = getch();
Respuesta4[13] = getch();
Respuesta4[14] = getch();

while(v<15) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta4[v]=='O')
{
ok4[0]=Respuesta4[v];

}
if(Respuesta4[v]=='K')
{
ok4[1]=Respuesta4[v];

}
if(Respuesta4[v-1]=='K')
{
ok4[2]='\0';
}
v++; // CAMBIAR
}
//while(1);

ComandoRecibido4=ok4;
if (strcmp(ComandoRecibido4,"OK") == 0){ // Todo a ido bien
// while(1);
LED3=1;
error_comando=0;

}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}










//*****************************************************************************
//QUINTO COMANDO AT
//*****************************************************************************
putst ("ATS536=1"); // Desconnectar el echo.
putch ('\r');

Respuesta5[0] = getch();
Respuesta5[1] = getch();
Respuesta5[2] = getch();
Respuesta5[3] = getch();
Respuesta5[4] = getch();
Respuesta5[5] = getch();
Respuesta5[6] = getch();
Respuesta5[7] = getch();
Respuesta5[8] = getch();
Respuesta5[9] = getch();
Respuesta5[10] = getch();
Respuesta5[11] = getch();
Respuesta5[12] = getch();
Respuesta5[13] = getch();
Respuesta5[14] = getch();

while(w<15) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta5[w]=='O')
{
ok5[0]=Respuesta5[w];

}
if(Respuesta5[w]=='K')
{
ok5[1]=Respuesta5[w];

}
if(Respuesta5[w-1]=='K')
{
ok5[2]='\0';
}
w++; // CAMBIAR
}
//while(1);

ComandoRecibido5=ok5;
if (strcmp(ComandoRecibido5,"OK") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
LED0=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}







//*****************************************************************************
//SEXTO COMANDO AT
//*****************************************************************************

putst ("AT+BTK=\"1234\"");
putch ('\r');



Respuesta6[0] = getch();
Respuesta6[1] = getch();
Respuesta6[2] = getch();
Respuesta6[3] = getch();
Respuesta6[4] = getch();
Respuesta6[5] = getch();
Respuesta6[6] = getch();
Respuesta6[7] = getch();
Respuesta6[8] = getch();
Respuesta6[9] = getch();
Respuesta6[10] = getch();
Respuesta6[11] = getch();
Respuesta6[12] = getch();
Respuesta6[13] = getch();
Respuesta6[14] = getch();
Respuesta6[15] = getch();
Respuesta6[16] = getch();
Respuesta6[17] = getch();
Respuesta6[18] = getch();
Respuesta6[19] = getch();



//while(1);

while(q<20) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta6[q]=='O')
{
ok6[0]=Respuesta6[q];

}
if(Respuesta6[q]=='K')
{
ok6[1]=Respuesta6[q];

}
if(Respuesta6[q-1]=='K')
{
ok6[2]='\0';
}
q++; // CAMBIAR
}
//while(1);

ComandoRecibido6=ok6;
if (strcmp(ComandoRecibido6,"OK") == 0){ // Todo a ido bien
// while(1);
LED1=0;
error_comando=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}




//*****************************************************************************
//SEPTIMO COMANDO AT
//*****************************************************************************
putst ("AT&W");
putch ('\r');

Respuesta7[0] = getch();
Respuesta7[1] = getch();
Respuesta7[2] = getch();
Respuesta7[3] = getch();
Respuesta7[4] = getch();
Respuesta7[5] = getch();
Respuesta7[6] = getch();
Respuesta7[7] = getch();
Respuesta7[8] = getch();
Respuesta7[9] = getch();
Respuesta7[10] = getch();



while(t<11) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta7[t]=='O')
{
ok7[0]=Respuesta7[t];

}
if(Respuesta7[t]=='K')
{
ok7[1]=Respuesta7[t];

}
if(Respuesta7[t-1]=='K')
{
ok7[2]='\0';
}
t++;
}
//while(1);

ComandoRecibido7=ok7;
if (strcmp(ComandoRecibido7,"OK") == 0){ // Todo a ido bien
// while(1);
LED2=0;
error_comando=0;

}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}




//*****************************************************************************
//OCTAVO COMANDO AT
//*****************************************************************************     

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

Respuesta8[0] = getch();
Respuesta8[1] = getch();
Respuesta8[2] = getch();
Respuesta8[3] = getch();
Respuesta8[4] = getch();
Respuesta8[5] = getch();
Respuesta8[6] = getch();
Respuesta8[7] = getch();
Respuesta8[8] = getch();
Respuesta8[9] = getch();




while(d<10) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
{
if(Respuesta8[d]=='O')
{
ok8[0]=Respuesta8[d];

}
if(Respuesta8[d]=='K')
{
ok8[1]=Respuesta8[d];

}
if(Respuesta8[d-1]=='K')
{
ok8[2]='\0';
}
d++;
}
//while(1);

ComandoRecibido8=ok8;
if (strcmp(ComandoRecibido8,"OK") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
LED3=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}







//Una condicion para saber que ya ha acabado de hacer los comandos AT

// Hay que esperar a recibir los mensajes y para eso hay que ir leyendo el buffer


// El otro dispositivo se quiere connectar con nosotros.
//Mensaje de aparejamiento : "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23


//*****************************************************************************
//MENSAJE DE APAREJAMIENTO: "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23
//*****************************************************************************     

ComandoRecibido9=ok9;
LeerRespuesta(ok9);

//while(1);


if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}


//*****************************************************************************
//MENSAJE DE LLAMADA: "RING 008098E6A5F4 (17 caracteres)" +4 =21
//*****************************************************************************     

ComandoRecibido10=ok10;
LeerRespuesta(ok10);

//while(1);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}



//*****************************************************************************
//MENSAJE DE CONEXION: CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4
//*****************************************************************************     

ComandoRecibido11=ok11;
LeerRespuesta(ok11);

//while(1);


if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
// while(1);
error_comando=0;
final=0;
}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;

}



Desinstalo el compilador y me bajo ese programa y limpio los registros?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #192 en: 22 de Enero de 2011, 10:47:11 »
Gracias de nuevo. Perdon, no me fije bien como iba la funcion Respuesta. Entonces esa funcion es capaz de quedarse con los mensajes:

PAIR 0 008098E6A5F4
RING 008098E6A5F
CONNECT 008098E6A5F4,1101 A

Porque veo que se acaba cuando hay un \n. Habria que modificarla no?

Por otro lado, ahora ya solo me aparecen esos errores por lo del espacio. Creo que es porque uso muchos vectores, hechale un vistazo al codigo:

.................

Desinstalo el compilador y me bajo ese programa y limpio los registros?

  No, no creo que haya que modificar la función. Acordate que la supuesta respuesta es \r\n xxxxxxxxxx \r\n así que está bien que salga de la función cuando encuentra el caracter \n. Fijate que en la implementación de "LeerRespuesta" uso 2 getch() iniciales como para evitar los 2 primeros caracteres (que serían \r \n ) y luego hago while que termina si el caracter es \n.

  En cuanto a lo de los vectores insisto que deberías probar de declarar un sólo array y que lo vayas usando para las distintas respuestas y no que declares uno para cada respuesta. Lo mismo vale para los punteros.
  Esto es lo que vos declarás...

Código: C
  1. char Respuesta1[12];
  2. char ok1[3]; // ES FIJO!!
  3. register const char  *ComandoRecibido1;
  4.  
  5. char Respuesta2[13];
  6. char ok2[3]; // ES FIJO!!
  7. register const char  *ComandoRecibido2;
  8.  
  9. char Respuesta3[15];
  10. char ok3[3]; // ES FIJO!!
  11. register const char  *ComandoRecibido3;
  12.  
  13. char Respuesta4[15];
  14. char ok4[3]; // ES FIJO!!
  15. register const char  *ComandoRecibido4;
  16.  
  17. char Respuesta5[15];
  18. char ok5[3]; // ES FIJO!!
  19. register const char  *ComandoRecibido5;
  20.  
  21. char Respuesta6[20];
  22. char ok6[3]; // ES FIJO!!
  23. register const char  *ComandoRecibido6;
  24.  
  25. char Respuesta7[11];
  26. char ok7[3]; // ES FIJO!!
  27. register const char  *ComandoRecibido7;
  28.  
  29. char Respuesta8[10];
  30. char ok8[3]; // ES FIJO!!
  31. register const char  *ComandoRecibido8;
  32.  
  33.  
  34. char Respuesta9[23];
  35. char ok9[19]; // OJO aqui son 19 caracteres + 4
  36. register const char  *ComandoRecibido9;
  37.  
  38. char Respuesta10[21];
  39. char ok10[17]; // OJO aqui son 19 caracteres + 4
  40. register const char  *ComandoRecibido10;
  41.  
  42. char Respuesta11[31];
  43. char ok11[27]; // OJO aqui son 19 caracteres + 4
  44. register const char  *ComandoRecibido11;

  Y lo vas usando...

Código: C
  1. //*****************************************************************************
  2. //PRIMER COMANDO AT
  3. //*****************************************************************************
  4. putst ("AT"); // Desconnectar el echo.
  5. putch ('\r');
  6.  
  7. Respuesta1[0] = getch();
  8. Respuesta1[1] = getch();
  9. Respuesta1[2] = getch();
  10. Respuesta1[3] = getch();
  11. Respuesta1[4] = getch();
  12. Respuesta1[5] = getch();
  13. Respuesta1[6] = getch();
  14. Respuesta1[7] = getch();
  15. Respuesta1[8] = getch();
  16.  
  17.  
  18.  
  19. while(i<9)
  20. {
  21.         if(Respuesta1[i]=='O')
  22.         {
  23.                 ok1[0]=Respuesta1[i];
  24.        
  25.         }
  26.         if(Respuesta1[i]=='K')
  27.         {
  28.                 ok1[1]=Respuesta1[i];
  29.         }
  30.        
  31.         if(Respuesta1[i-1]=='K')
  32.         {
  33.                 ok1[2]='\0';
  34.         }
  35.  
  36. i++;
  37. }
  38.  
  39. ComandoRecibido1=ok1;
  40. if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
  41. //      while(1);
  42.         LED0=1;
  43.         error_comando=0;
  44.        
  45. }
  46. else{                                    // No es el comando bueno
  47. //      while(1);
  48.         error_comando=1;
  49. }
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. //*****************************************************************************
  58. //SEGUNDO COMANDO AT
  59. //*****************************************************************************
  60.  
  61. putst ("ATS0=1"); // Desconnectar el echo.
  62. putch ('\r');
  63.  
  64. Respuesta2[0] = getch();
  65. Respuesta2[1] = getch();
  66. Respuesta2[2] = getch();
  67. Respuesta2[3] = getch();
  68. Respuesta2[4] = getch();
  69. Respuesta2[5] = getch();
  70. Respuesta2[6] = getch();
  71. Respuesta2[7] = getch();
  72. Respuesta2[8] = getch();
  73. Respuesta2[9] = getch();
  74. Respuesta2[10] = getch();
  75. Respuesta2[11] = getch();
  76. Respuesta2[12] = getch();
  77.  
  78.  
  79. while(j<13) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  80. {
  81.         if(Respuesta2[j]=='O')
  82.         {
  83.                 ok2[0]=Respuesta2[j];
  84.                
  85.         }
  86.         if(Respuesta2[j]=='K')
  87.         {
  88.                 ok2[1]=Respuesta2[j];
  89.        
  90.         }
  91.         if(Respuesta2[j-1]=='K')
  92.         {
  93.                 ok2[2]='\0';
  94.         }
  95. j++;
  96. }
  97. //while(1);
  98.  
  99. ComandoRecibido2=ok2;
  100. if (strcmp(ComandoRecibido2,"OK") == 0){ // Todo a ido bien
  101. //      while(1);
  102.         LED1=1;
  103.         error_comando=0;
  104.        
  105. }
  106. else{                                    // No es el comando bueno
  107. //      while(1);
  108.         error_comando=1;
  109.  
  110. }      
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120. //*****************************************************************************
  121. //TERCER COMANDO AT
  122. //*****************************************************************************
  123.  
  124. putst ("ATS512=4"); // Desconnectar el echo.
  125. putch ('\r');
  126.  
  127. Respuesta3[0] = getch();
  128. Respuesta3[1] = getch();
  129. Respuesta3[2] = getch();
  130. Respuesta3[3] = getch();
  131. Respuesta3[4] = getch();
  132. Respuesta3[5] = getch();
  133. Respuesta3[6] = getch();
  134. Respuesta3[7] = getch();
  135. Respuesta3[8] = getch();
  136. Respuesta3[9] = getch();
  137. Respuesta3[10] = getch();
  138. Respuesta3[11] = getch();
  139. Respuesta3[12] = getch();
  140. Respuesta3[13] = getch();
  141. Respuesta3[14] = getch();
  142.  
  143.  
  144. while(z<15)
  145. {
  146.         if(Respuesta3[z]=='O')
  147.         {
  148.                 ok3[0]=Respuesta3[z];
  149.                
  150.         }
  151.         if(Respuesta3[z]=='K')
  152.         {
  153.                 ok3[1]=Respuesta3[z];
  154.        
  155.         }
  156.         if(Respuesta3[z-1]=='K')
  157.         {
  158.                 ok3[2]='\0';
  159.         }
  160. z++; // CAMBIAR
  161. }
  162. //while(1);
  163.  
  164. ComandoRecibido3=ok3;
  165. if (strcmp(ComandoRecibido3,"OK") == 0){ // Todo a ido bien
  166.         //while(1);
  167.         LED2=1;
  168.         error_comando=0;
  169.        
  170. }
  171. else{                                    // No es el comando bueno
  172.         //while(1);
  173.         error_comando=1;
  174.  
  175. }      
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182. //*****************************************************************************
  183. //QUARTO COMANDO AT
  184. //*****************************************************************************
  185.  
  186. putst ("ATS502=1"); // Desconnectar el echo.
  187. putch ('\r');
  188.  
  189. Respuesta4[0] = getch();
  190. Respuesta4[1] = getch();
  191. Respuesta4[2] = getch();
  192. Respuesta4[3] = getch();
  193. Respuesta4[4] = getch();
  194. Respuesta4[5] = getch();
  195. Respuesta4[6] = getch();
  196. Respuesta4[7] = getch();
  197. Respuesta4[8] = getch();
  198. Respuesta4[9] = getch();
  199. Respuesta4[10] = getch();
  200. Respuesta4[11] = getch();
  201. Respuesta4[12] = getch();
  202. Respuesta4[13] = getch();
  203. Respuesta4[14] = getch();
  204.  
  205. while(v<15) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  206. {
  207.         if(Respuesta4[v]=='O')
  208.         {
  209.                 ok4[0]=Respuesta4[v];
  210.                
  211.         }
  212.         if(Respuesta4[v]=='K')
  213.         {
  214.                 ok4[1]=Respuesta4[v];
  215.        
  216.         }
  217.         if(Respuesta4[v-1]=='K')
  218.         {
  219.                 ok4[2]='\0';
  220.         }
  221. v++; // CAMBIAR
  222. }
  223. //while(1);
  224.  
  225. ComandoRecibido4=ok4;
  226. if (strcmp(ComandoRecibido4,"OK") == 0){ // Todo a ido bien
  227. //      while(1);
  228.         LED3=1;
  229.         error_comando=0;
  230.        
  231. }
  232. else{                                    // No es el comando bueno
  233. //      while(1);
  234.         error_comando=1;
  235.  
  236. }      
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247. //*****************************************************************************
  248. //QUINTO COMANDO AT
  249. //*****************************************************************************
  250. putst ("ATS536=1"); // Desconnectar el echo.
  251. putch ('\r');
  252.  
  253. Respuesta5[0] = getch();
  254. Respuesta5[1] = getch();
  255. Respuesta5[2] = getch();
  256. Respuesta5[3] = getch();
  257. Respuesta5[4] = getch();
  258. Respuesta5[5] = getch();
  259. Respuesta5[6] = getch();
  260. Respuesta5[7] = getch();
  261. Respuesta5[8] = getch();
  262. Respuesta5[9] = getch();
  263. Respuesta5[10] = getch();
  264. Respuesta5[11] = getch();
  265. Respuesta5[12] = getch();
  266. Respuesta5[13] = getch();
  267. Respuesta5[14] = getch();
  268.  
  269. while(w<15) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  270. {
  271.         if(Respuesta5[w]=='O')
  272.         {
  273.                 ok5[0]=Respuesta5[w];
  274.                
  275.         }
  276.         if(Respuesta5[w]=='K')
  277.         {
  278.                 ok5[1]=Respuesta5[w];
  279.        
  280.         }
  281.         if(Respuesta5[w-1]=='K')
  282.         {
  283.                 ok5[2]='\0';
  284.         }
  285. w++; // CAMBIAR
  286. }
  287. //while(1);
  288.  
  289. ComandoRecibido5=ok5;
  290. if (strcmp(ComandoRecibido5,"OK") == 0){ // Todo a ido bien
  291. //      while(1);
  292.         error_comando=0;
  293.         LED0=0;
  294. }
  295. else{                                    // No es el comando bueno
  296. //      while(1);
  297.         error_comando=1;
  298.  
  299. }
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307. //*****************************************************************************
  308. //SEXTO COMANDO AT
  309. //*****************************************************************************
  310.  
  311. putst ("AT+BTK=\"1234\"");
  312. putch ('\r');
  313.  
  314.  
  315.  
  316. Respuesta6[0] = getch();
  317. Respuesta6[1] = getch();
  318. Respuesta6[2] = getch();
  319. Respuesta6[3] = getch();
  320. Respuesta6[4] = getch();
  321. Respuesta6[5] = getch();
  322. Respuesta6[6] = getch();
  323. Respuesta6[7] = getch();
  324. Respuesta6[8] = getch();
  325. Respuesta6[9] = getch();
  326. Respuesta6[10] = getch();
  327. Respuesta6[11] = getch();
  328. Respuesta6[12] = getch();
  329. Respuesta6[13] = getch();
  330. Respuesta6[14] = getch();
  331. Respuesta6[15] = getch();
  332. Respuesta6[16] = getch();
  333. Respuesta6[17] = getch();
  334. Respuesta6[18] = getch();
  335. Respuesta6[19] = getch();
  336.  
  337.  
  338.  
  339. //while(1);
  340.  
  341. while(q<20) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  342. {
  343.         if(Respuesta6[q]=='O')
  344.         {
  345.                 ok6[0]=Respuesta6[q];
  346.                
  347.         }
  348.         if(Respuesta6[q]=='K')
  349.         {
  350.                 ok6[1]=Respuesta6[q];
  351.        
  352.         }
  353.         if(Respuesta6[q-1]=='K')
  354.         {
  355.                 ok6[2]='\0';
  356.         }
  357. q++; // CAMBIAR
  358. }
  359. //while(1);
  360.  
  361. ComandoRecibido6=ok6;
  362. if (strcmp(ComandoRecibido6,"OK") == 0){ // Todo a ido bien
  363. //      while(1);
  364.         LED1=0;
  365.         error_comando=0;
  366. }
  367. else{                                    // No es el comando bueno
  368. //      while(1);
  369.         error_comando=1;
  370.  
  371. }
  372.  
  373.  
  374.  
  375.  
  376. //*****************************************************************************
  377. //SEPTIMO COMANDO AT
  378. //*****************************************************************************
  379. putst ("AT&W");
  380. putch ('\r');
  381.  
  382. Respuesta7[0] = getch();
  383. Respuesta7[1] = getch();
  384. Respuesta7[2] = getch();
  385. Respuesta7[3] = getch();
  386. Respuesta7[4] = getch();
  387. Respuesta7[5] = getch();
  388. Respuesta7[6] = getch();
  389. Respuesta7[7] = getch();
  390. Respuesta7[8] = getch();
  391. Respuesta7[9] = getch();
  392. Respuesta7[10] = getch();
  393.  
  394.  
  395.  
  396. while(t<11) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  397. {
  398.         if(Respuesta7[t]=='O')
  399.         {
  400.                 ok7[0]=Respuesta7[t];
  401.                
  402.         }
  403.         if(Respuesta7[t]=='K')
  404.         {
  405.                 ok7[1]=Respuesta7[t];
  406.        
  407.         }
  408.         if(Respuesta7[t-1]=='K')
  409.         {
  410.                 ok7[2]='\0';
  411.         }
  412. t++;
  413. }
  414. //while(1);
  415.  
  416. ComandoRecibido7=ok7;
  417. if (strcmp(ComandoRecibido7,"OK") == 0){ // Todo a ido bien
  418. //      while(1);
  419.         LED2=0;
  420.         error_comando=0;
  421.        
  422. }
  423. else{                                    // No es el comando bueno
  424. //      while(1);
  425.         error_comando=1;
  426.  
  427. }
  428.  
  429.  
  430.  
  431.  
  432. //*****************************************************************************
  433. //OCTAVO COMANDO AT
  434. //*****************************************************************************    
  435.  
  436. putst ("ATZ");
  437. putch ('\r');
  438.  
  439. Respuesta8[0] = getch();
  440. Respuesta8[1] = getch();
  441. Respuesta8[2] = getch();
  442. Respuesta8[3] = getch();
  443. Respuesta8[4] = getch();
  444. Respuesta8[5] = getch();
  445. Respuesta8[6] = getch();
  446. Respuesta8[7] = getch();
  447. Respuesta8[8] = getch();
  448. Respuesta8[9] = getch();
  449.  
  450.  
  451.  
  452.  
  453. while(d<10) // OJO CAMBIAR ESTO DE UN COMANDO A OTRO. SINO SE QUEDA Y NO ACABA
  454. {
  455.         if(Respuesta8[d]=='O')
  456.         {
  457.                 ok8[0]=Respuesta8[d];
  458.                
  459.         }
  460.         if(Respuesta8[d]=='K')
  461.         {
  462.                 ok8[1]=Respuesta8[d];
  463.        
  464.         }
  465.         if(Respuesta8[d-1]=='K')
  466.         {
  467.                 ok8[2]='\0';
  468.         }
  469. d++;
  470. }
  471. //while(1);
  472.  
  473. ComandoRecibido8=ok8;
  474. if (strcmp(ComandoRecibido8,"OK") == 0){ // Todo a ido bien
  475. //      while(1);
  476.         error_comando=0;
  477.         final=0;
  478.         LED3=0;
  479. }
  480. else{                                    // No es el comando bueno
  481. //      while(1);
  482.         error_comando=1;
  483.  
  484. }
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492. //Una condicion para saber que ya ha acabado de hacer los comandos AT
  493.  
  494. // Hay que esperar a recibir los mensajes y para eso hay que ir leyendo el buffer
  495.  
  496.  
  497. // El otro dispositivo se quiere connectar con nosotros.
  498. //Mensaje de aparejamiento : "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23
  499.  
  500.  
  501. //*****************************************************************************
  502. //MENSAJE DE APAREJAMIENTO: "PAIR 0 008098E6A5F4" (19 caracteres) + 4 =23
  503. //*****************************************************************************    
  504.  
  505. ComandoRecibido9=ok9;
  506. LeerRespuesta(ok9);
  507.  
  508. //while(1);
  509.  
  510.  
  511. if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
  512. //      while(1);
  513.         error_comando=0;
  514.         final=0;
  515. }
  516. else{                                    // No es el comando bueno
  517. //      while(1);
  518.         error_comando=1;
  519.  
  520. }

  Siguiendo tu modo de trabajo, se puede declarar algo así....

Código: C
  1. char Respuesta[25];
  2. char ok[3]

  Y usarlo...

Código: C
  1. // leo la primer respuesta
  2. Respuesta[0] = getch();
  3. Respuesta[1] = getch();
  4. Respuesta[2] = getch();
  5. .......
  6. ........// repetimos las líneas las veces que sea necesario
  7.  
  8. while(i<9)
  9. {
  10.         if (Respuesta[i]=='O')
  11.         {
  12.                 ok[0]=Respuesta[i];
  13.        
  14.         }
  15.         if (Respuesta[i]=='K')
  16.         {
  17.                 ok[1]=Respuesta[i];
  18.         }
  19.        
  20.         if (Respuesta[i-1]=='K')
  21.         {
  22.                 ok[2]='\0';
  23.         }
  24. i++;
  25. }
  26.  
  27. if (strcmp(ok,"OK") == 0){ // Todo a ido bien
  28. //      while(1);
  29.         LED0=1;
  30.         error_comando=0;
  31.        
  32. }
  33. else{                                    // No es el comando bueno
  34. //      while(1);
  35.         error_comando=1;
  36. }

  Después se repite exactamente lo mismo pero para los otros comandos. De esta manera sólo se declararon dos variables, en lugar de declarar una por respuesta.
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 #193 en: 22 de Enero de 2011, 11:00:50 »
Pero el buffer de respuesta yo lo tengo con la medida exacta para que no se cuelen caracteres extraños, ayer me pasaba.
Y si cuando debugo quiero ver el valor de cada buffer de esta manera resulta mas senzillo..

He probado eso que dices de limpiar los registros y sigue saliendo el error.. habra que tirar por donde tu dices pero creo que  si ponemos un unico vector sera peor..
No se la verdad.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #194 en: 22 de Enero de 2011, 11:39:34 »
Pero el buffer de respuesta yo lo tengo con la medida exacta para que no se cuelen caracteres extraños, ayer me pasaba.
Y si cuando debugo quiero ver el valor de cada buffer de esta manera resulta mas senzillo..

He probado eso que dices de limpiar los registros y sigue saliendo el error.. habra que tirar por donde tu dices pero creo que  si ponemos un unico vector sera peor..
No se la verdad.

  A ver, puede ser que para debuggear tal vez sea más sencillo; pero velo desde otro ladao. Si en cada comparación con strcmp vas encendiendo un led vas a saber que comparación dio bien. Si dio bien quiere decir que el buffer tenía almacenado el valor correcto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything