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

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

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #165 en: 21 de Enero de 2011, 14:03:49 »
Sigue sin ir... porque no probamos de pasarle un puntero con un OK declarado des de fuera en vez de poner OK ahi?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #166 en: 21 de Enero de 2011, 14:11:41 »
Sigue sin ir... porque no probamos de pasarle un puntero con un OK declarado des de fuera en vez de poner OK ahi?

  Probalo si querés, pero no creo que haya diferencia ya que en la implementación de strcmp declara a los parámetros que se les pasa como "register const char *" así que internamente los trata como constantes y si son constantes es lo mismo pasar el puntero que directamente el string.
  Fijate en la implementación de putst, que también esta declarado (el parámetro) como "const char *" y también se le puede pasar tanto un puntero como un string directamente.
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 #167 en: 21 de Enero de 2011, 14:35:14 »
He probado de declararlo como
register const char  * ComandoRecibido1;

Y no entra..
Alguna idea?

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #168 en: 21 de Enero de 2011, 14:41:06 »
He testeado que si que entrase a la funcion.

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

if (strcmp(ComandoRecibido1,ComandoIdeal) == 0){ // Todo a ido bien

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #169 en: 21 de Enero de 2011, 15:26:27 »
  Acá te muestro otra variante del programa donde le mando primero el comando AT y leo la respuesta con sucesivos getch() (pero sólo almaceno en la variable Respuesta lo que me interesa). Luego mando el comando ATS para que el módulo simulado responda "ERROR" y en este caso la respuesta la leo mediante la función "LeerRespuesta" y es almacenada en la variable RespuestaConFuncion.

 
Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3.  
  4. __CONFIG (1, HS & CPUDIV4 & USBPLL & PLLDIV5 & FCMDIS & IESODIS);
  5. __CONFIG (2, BORDIS & WDTDIS & PWRTDIS);
  6. __CONFIG (3, MCLRDIS);
  7. __CONFIG (4, LVPDIS);
  8.  
  9. #define BAUD 9600
  10. #define PIC_CLK 5000000
  11.  
  12.  
  13. char dummy;
  14.  
  15.  
  16. void retardo(void)
  17. {
  18.   int veces;
  19.  
  20.   for (veces = 10000; veces > 0; veces--)
  21.   {
  22.     NOP();
  23.     NOP();
  24.     NOP();
  25.   }
  26. }
  27.  
  28.  
  29.  
  30. void serial_setup(void)
  31. {
  32.   #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  33.   BRGH = 1;
  34.   BRG16 = 0;
  35.   SPBRG = SPBRG_VALUE;
  36.   SPEN = 1; // Enable serial port
  37.   SYNC = 0; // Asincrono
  38.   TXIE = 0; // Desactivar interrupciones en tx
  39.   TXEN = 1; // Enable the transmitter
  40.   TX9 = 0; // 8 bits transmission
  41.   RCIE = 1; // Activar interrupciones en rx
  42.   RX9 = 0; // 8 bits reception
  43.   CREN = 1; //Enable reception
  44.   #define clear_usart_errors_inline     if (OERR)\
  45.                                     {\
  46.                                       TXEN = 0;\
  47.                                       TXEN = 1;\
  48.                                       CREN = 0;\
  49.                                       CREN = 1;\
  50.                                     }\
  51.                                     if (FERR)\
  52.                                     {\
  53.                                       dummy = RCREG;\
  54.                                       TXEN = 0;\
  55.                                       TXEN = 1;\
  56.                                     }
  57. }
  58.  
  59. void putch(unsigned char c)
  60. {
  61.   while (!TXIF)
  62.   {
  63.     clear_usart_errors_inline;
  64.     CLRWDT();
  65.   }
  66.   TXREG = c;
  67. }
  68.  
  69. void putst(register const char *str)
  70. {
  71.   while ((*str) != 0)
  72.   {
  73.     putch (*str);
  74.     str++;
  75.   }
  76. }
  77.  
  78. unsigned char getch(void)
  79. {
  80.   while (RCIF != 1)
  81.   {                             //1 = The EUSART receive buffer, RCREG, is full
  82.     CLRWDT();
  83.     clear_usart_errors_inline;
  84.   }
  85.   return RCREG;
  86. }
  87.  
  88.  
  89. char * LeerRespuesta(char * mensaje)
  90. {
  91.   char CaracterLeido;
  92.   char * Mensaje;
  93.  
  94.   Mensaje = mensaje;
  95.   getch();
  96.   getch();
  97.   do
  98.   {
  99.     CaracterLeido = getch();
  100.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  101.     {
  102.       *Mensaje = CaracterLeido;
  103.       Mensaje++;
  104.     }
  105.     *Mensaje = '\0';
  106.   }
  107.   while (CaracterLeido != '\n');
  108.   return mensaje;
  109. }
  110.  
  111.  
  112.  
  113.  
  114. void init_system (void)
  115. {
  116.   TRISA = 255;
  117.   //CS = 1;
  118.   TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  119.   TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  120. }
  121.  
  122.  
  123. void main (void)
  124. {
  125.  
  126.   char Respuesta[10];
  127.   char RespuestaConFuncion[10];
  128.  
  129.   init_system();
  130.   serial_setup();
  131.   PORTB = 0;
  132.  
  133.   putst ("AT");
  134.   putch ('\r');
  135.  
  136.   getch();
  137.   getch();
  138.   Respuesta[0] = getch();
  139.   Respuesta[1] = getch();
  140.   getch();
  141.   getch();
  142.  
  143.   if (strcmp (Respuesta, "OK") == 0) RB6 = 1;
  144.  
  145.   putst ("ATS");
  146.   putch ('\r');
  147.   LeerRespuesta(RespuestaConFuncion);
  148.   if (strcmp (RespuestaConFuncion, "ERROR") == 0) RB7 = 1;
  149.  
  150.   while (1);
  151. }

  Y acá una captura para que veas tanto el valor de Respuesta como el de RespuestaConFuncion. Como puede verse ambos son correctos.
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 #170 en: 21 de Enero de 2011, 15:31:00 »
De momento lo dl error no lo hare. Primero mejor centrarse en que funcione el strcmp y despues a hacerlo robusto. Piensa que no hay porque equivocarse y si ese fuera el caso puedo conectar el modulo al hyperterminal, mandarle un at y que todo vuelva a estar ok.

Como arreglo lo del strcmp? a ti te funciona?

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #171 en: 21 de Enero de 2011, 15:38:49 »
Estoy debugando y he entrado en la funcion strcmp

#include   <string.h>

int
strcmp(register const char * s1, register const char * s2)
{
   register signed char   r;

   while(!(r = (unsigned char)*s1 - (unsigned char)*s2++) && *s1++)
      continue;
   return r;
}

Por si eso puede ayudar.. dejo la funcion aqui

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #172 en: 21 de Enero de 2011, 17:07:40 »
  Sí, a mi me funciona bárbaro strcmp. Como puede verse en el programa, pongo a 1 la salida de RB6 si la comparación da 0 (que quiere decir que las palabras son iguales) y en el segundo caso pongo a 1 RB7. Y funciona bien porque si pongo algo distinto ya no se hace 1 la salida correspondiente.
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 #173 en: 21 de Enero de 2011, 17:35:43 »
A mi no me funciona y lo que tengo almacenado en el buffer ok es "OK". Te dejo el codigo, miratelo por favor:
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;



//CAMBIAR A 6 CON EL DISPOSITIVO
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 * RespuestaRecibida;
char Respuesta[9];
char ok[2];
register const char  *ComandoRecibido1;
register const char *ComandoIdeal = "OK";

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,ComandoIdeal) == 0){ // Todo a ido bien
while(1);
LED0=1;
error_comando=0;
}
else{                                    // No es el comando bueno
while(1);
error_comando=1;

while(error_comando==1){
putst ("ATE0");
putch ('\r');
// LeerRespuesta (ComandoRecibido1);

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

}

}
}
Que puede pasar? el buffer esta bien....

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #174 en: 21 de Enero de 2011, 17:53:12 »
  A mi me parece que tenés un terrible error en esta parte del código...

Código: C
  1. ComandoRecibido1=ok;
  2. if (strcmp(ComandoRecibido1,ComandoIdeal) == 0){ // Todo a ido bien
  3.         while(1);
  4.         LED0=1;
  5.         error_comando=0;
  6. }
  7. else{                                    // No es el comando bueno
  8.         while(1);
  9.         error_comando=1;
  10.  
  11.         while(error_comando==1){
  12.         putst ("ATE0");
  13.         putch ('\r');
  14. //      LeerRespuesta (ComandoRecibido1);
  15.  
  16.                 if (strcmp(ComandoRecibido1,"OK") == 0){
  17.                 error_comando=0;
  18.                
  19.                 }
  20.                
  21.         }
  22. }

  Después de usar la función strcmp, ocurre que si dio 0 entrás al "while(1);" Eso es un loop infinito!!!!!!!!!
y si o dio 0 también entrás a un "while(1);" y recién después querés hacer "error_comando = 1"

  Esos while están demás porque se cual fuere el resultado de la comparación te vas a quedar colgado en esa parte del programa.
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 #175 en: 21 de Enero de 2011, 17:56:48 »
Ahi es donde pongo los puntos de parada con el debugador para ver donde entro, si en uno o en otro.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #176 en: 21 de Enero de 2011, 18:01:51 »
Ahi es donde pongo los puntos de parada con el debugador para ver donde entro, si en uno o en otro.

  Si, está bien -quizá-, pero estás poniendo el while antes de encender el LED, entonces ¿Cómo vas a saber si se enciende o no?
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 #177 en: 21 de Enero de 2011, 18:03:03 »
Estoy con el debug, el programa no funciona porque salta directamente al segundo while, por el primero no pasa. Igualmente lo he probado ahora con LED y tampcoo funciona.
que puede pasar?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #178 en: 21 de Enero de 2011, 18:09:04 »
  Tal vez me equivoque pero creo que toda cadena de caracteres en C tiene que terminar con el caracter '\0' (nulo). En tu caso a ok lo hiciste de 2 caracteres y que son ocupados por la O y la K pero no tenés ningún otro lugar como para el caracter nulo que indica el final del string. Tal vez eso produzca errores en la rutina de comparación. ¿Por qué no definís a ok como de 10 caracteres para asegurarte que vas a tener espacio para el caracter nulo?
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 #179 en: 21 de Enero de 2011, 18:12:32 »
Braaaavo! era eso. Voy a seguir con los otros comandos. Muchas gracias

Despues te comento