TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: edu1989 en 12 de Enero de 2011, 08:02:26

Título: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 08:02:26
Hola a todos, estoy haciendo una funcion que envia un comando at por el puerto serie y tiene que recibir un OK. Hay que  comparar lo que se recibe por el puerto serie con un "OK" Lo he hecho de la forma:

Código: [Seleccionar]
//Primer comando AT
putst ("AT/n");


 if (getch_available() == true) //Comprueba si hay un caracter disponible recibido por el puerto serie
 {
   comando_recibido1 = getch();    // Lee el caracter ( tendria que recibir un "OK")

//Comprovar que reciba  "OK"
while (strcmp(comando_recibido1, comando_recibido_ideal)== 1 ){  // Son distintos
      error_comando=1;
 }
if(strcmp(comando_recibido1, comando_recibido_ideal) == 0 )  // Son iguales
      error_comando=0;
 }


La declaración de las variables es la siguiente:
Código: [Seleccionar]
const char * comando_recibido_ideal[]="OK";
const char * comando_recibido1[2];  // Es 2 porque espero recibir un OK

Espero que me ayuden, muchas gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 12 de Enero de 2011, 13:57:48
  Hola Edu, como ví tu mensaje aquí (en la sección "Programadores") lo reporté al moderador para ver si lo podía cambiar a la sección "Primeros pasos" y dejarlo en el hilo que creaste "Problema: aparecen caracteres raros PIC18f4550 [Hi-tech PICC-18]" para que esté todo junto.

  Ahora paso a responder en base a tu consulta.

  En el caso de la definición de "comando_recibido_ideal" puede estar bien ya que sería una constante, de todos modos yo la definiría así

Código: C
  1. const char * comando_recibido_idea[2] = "OK";

  Pero en el caso de "comando_recibido", no es constante ya que en ella vas a escribir lo que recibas por el RS232. Para este caso se puede hacer lo siguiente

Código: C
  1. char BufferComando[2]; // declaro una variable de dos caracteres
  2. char * comando_recibido; // declaro un puntero a char
  3.  
  4. comando_recibido = BufferComando; // hago que el puntero apunte a la variable donde almacenaré el dato recibido

  De esa manera vas a poder comparar bien los dos string.

  De todas maneras a mi se me había ocurrido otra opción y es que recibas los dos caracteres y los almacenes en BufferComando[0] y BufferComando[1] respectivamente y entonces se podría hacer un if de la siguiente manera

Código: C
  1. if (BufferComando[0] == 'O') && (BufferComando[1] == 'K')
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 14:54:23
Hola Angel,
Hoy he estado toqueteando y he llegado a esto:

Código: [Seleccionar]
//Primer comando AT
putst ("AT/n");

//Comprovar que reciba  "OK"
 while (getch_available() != false){ //Si hay un caracter disponible recibido por el puerto serie
 
if(getch_available()==true)
{
   //comando_recibido1 = UsartReadChar_nonstop();     
     cgets(comando_recibido1);
while (strcmp(comando_recibido1,"OK")== 1 ) // Son distintos
      error_comando=1;

if(strcmp(comando_recibido1,"OK") == 0 )  // Son iguales
      error_comando=0;
 
}
}

Con la declaración siguiente:
Código: [Seleccionar]
char  comando_recibido1[2];

Que te parece? Como puedes ver utilitzo una funcion nueva que sirve para leer una linea entrante en el terminal.

Muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 15:33:07
Hola de nuevo Angel,
Para explicarte un poco lo que estoy haciendo he hecho una captura de pantalla para que todo se vea mas claro.

Hasta ahora yo mismo configuraba el modulo Bluetooth que conecto a mi PIC con esos comandos que puedes ver en la imagen. El modulo cuando los recibe, envia un OK.
Queda configurado correctamente despues del mensaje de "OK" de confirmacion de la instruccion atz. La linea de PAIR sale una vez desde el otro modulo pongo el PIN(1234) que se ha seleccionado mediante la instruccion at+btk="1234"

Posteriormente, desde el otro modulo Bluetooth he de buscar los dispositivos que hay conectados en el rango de cobertura y conectarme contra el mio. La linea Ring es cuando abro el terminal del otro modulo, automaticamente se produce una llamada y pasan a estar conectados.

Resumiendo: Tengo que ir enviando los comandos y esperando el OK. Despues hay que esperar a recibir el mensaje de ring y de connect para empezar el programa.

Espero que haya quedado 1 poco mas claro. Esa era mi intencion.  Voy a seguir mirando lo otro, cuando puedas dime algo.

Muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 12 de Enero de 2011, 17:58:26

...........
Que te parece? Como puedes ver utilitzo una funcion nueva que sirve para leer una linea entrante en el terminal.

Muchas gracias.

  ¿La función que usas para leer toda una línea deja en la variable también el código correspondiente al CarrierReturn ( /n ), o sólo el string anterior a dicho código?

  Hay algo que no entiendo y es el porque dejás esta parte así...


Código: [Seleccionar]
.....
while (strcmp(comando_recibido1,"OK")== 1 ) // Son distintos
      error_comando=1;

if(strcmp(comando_recibido1,"OK") == 0 )  // Son iguales
      error_comando=0;
.....


  No sería conveniente hacer un if de esta manera...

Código: C
  1. if (strcmp (comando_recibido1, "OK") == 0) error_comando = 0;
  2. else
  3.   error_comando = 1;
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 18:38:58
Gracias. Tienes razon.
Por lo que respecta a la funcion cgets, te parece que lo hago bien?
Código: [Seleccionar]
//Comprovar que reciba  "OK"
 while (getch_available() != false){ //Si hay un caracter disponible recibido por el puerto serie
 
if(getch_available()==true)
{
   //comando_recibido1 = UsartReadChar_nonstop();     
     cgets(comando_recibido1);

La funcion UsartReadChar_nonstop es la que implemente en el codigo pasado.
Antes me salian errores en la lectura, q te parece?

Gracias de antemano
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 12 de Enero de 2011, 18:53:59
Gracias. Tienes razon.
Por lo que respecta a la funcion cgets, te parece que lo hago bien?
Código: [Seleccionar]
//Comprovar que reciba  "OK"
 while (getch_available() != false){ //Si hay un caracter disponible recibido por el puerto serie
 
if(getch_available()==true)
{
   //comando_recibido1 = UsartReadChar_nonstop();     
     cgets(comando_recibido1);

La funcion UsartReadChar_nonstop es la que implemente en el codigo pasado.
Antes me salian errores en la lectura, q te parece?

Gracias de antemano

  Es que no tengo idea de como es la función cgets(). Así que no sabría decirte. Si podés, subí el código de la implementación de dicha función para ver como trabaja.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 18:56:15
Y con la funcion UsartReadChar_nonstop?
Ahora subire la implementacion de la funcion cgets.

Gracias de antemano
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 12 de Enero de 2011, 18:58:47
Y con la funcion UsartReadChar_nonstop?
Ahora subire la implementacion de la funcion cgets.

Gracias de antemano

  Subí la implementación de ambas así puedo comparar y además probarlas en mi PC para intentar ver como trabaja cada una.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 19:41:45
Ok, gracias. Subo las dos:

Ejemplo función cgets (del manual del hitech)
Código: [Seleccionar]
#include <conio.h>
#include <string.h>
char buffer[80];
void
main (void)
{
for(;;) {
cgets(buffer);
if(strcmp(buffer, "exit") == 0)
break;
cputs("Type ’exit’ to finish\n");
}
}

Su definicion viene como:
Código: [Seleccionar]
The cgets() function will read one line of input from the console into the buffer passed as an argument.
It does so by repeated calls to getche(). As characters are read, they are buffered, with
backspace deleting the previously typed character, and ctrl-U deleting the entire line typed so far.
Other characters are placed in the buffer, with a carriage return or line feed (newline) terminating
the function. The collected string is null terminated.


Subo la función UsartReadChar_nonstop
Código: [Seleccionar]
unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty
    return 0;   
  return RCREG;
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 12 de Enero de 2011, 20:08:21
  Por lo que entiendo de la descripción, cgets() terminaría sólo si se recibe el CarrierReturn. Así que para que funcione en tu caso, el dispositivo tendría que responderte al comando con OK CarrierReturn, osea OK/n. Si es así te va a ir perfecto.

  Y me parece que UsartReadChar_nonstop(); lo que hace es ver como está el flag RCIF y si está en 1 (que indicaría que hay un caracter en el registro RCREG) lo lee y sino devuelve 0. Pero el nonstop parece referirse a que la función no se queda esperando que haya un caracter.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 12 de Enero de 2011, 20:18:58
Voy a mirar pero creo que si que responde con retorno de carro. Implementaremos la primera opcion entonces no?

Edito2: En el manual pone exactamente:
Código: [Seleccionar]
All commands are terminated by the carriage return character 0x0d, which is represented by the string <cr> in descriptions below this cannot be changed

Código: [Seleccionar]
All responses from the EZURiO device have carriage return and linefeed characters preceding and appending the response. These dual character sequences have the values 0x0D and 0x0A respectively and shall be represented by the string <cr,lf>.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 13 de Enero de 2011, 08:28:03
Hola de nuevo

Me tira un error en la linia:
if (strcmp(&comando_recibido1,&comando_recibido_ideal)== 0 )

Tanto si lo pongo asi como si lo pongo:
if (strcmp(&comando_recibido1,"OK")== 0 )

En los dos casos: conflicting declarations for variable

Por otro lado, creo que la funcion cgets funcionara mejor que la otra despues de leer que el dispositivo devolvia las instrucciones con retorno de carro.

Voy a seguir trabajando
Gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 13 de Enero de 2011, 09:57:03
Hola de nuevo

Me tira un error en la linia:
if (strcmp(&comando_recibido1,&comando_recibido_ideal)== 0 )

Tanto si lo pongo asi como si lo pongo:
if (strcmp(&comando_recibido1,"OK")== 0 )

En los dos casos: conflicting declarations for variable

Por otro lado, creo que la funcion cgets funcionara mejor que la otra despues de leer que el dispositivo devolvia las instrucciones con retorno de carro.

Voy a seguir trabajando
Gracias

  En la función strcmp no tenés que usar & antes de la variable. Te muestro un pequeño ejemplito que hice para probar simplemente la función de comparación y justamente funciona bien.

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. __CONFIG (HS & LVPDIS & WDTDIS);
  6.  
  7. #include "Def16f87xa.h"
  8. #pragma psect maintext=cuerpo
  9. void main(void)
  10. {
  11.   char Palabra2[2];
  12.   const char * ComandoIdeal = "OK";
  13.   char * ComandoRecibido;
  14.   char resultado = 10;
  15.   char PruebaConIf = 10;
  16.  
  17.   ComandoRecibido = Palabra2;
  18.   Palabra2[0] = 'O';
  19.   Palabra2[1] = 'K';
  20.   resultado = strcmp (ComandoIdeal, ComandoRecibido);
  21.  
  22.   resultado = strcmp (Palabra2, "OK");
  23.  
  24.   if ((Palabra2[0] == 'O') && (Palabra2[1] == 'K')) PruebaConIf = 0;
  25.   while (1);
  26. }

  Fijate que hice varias formas de controlar si lo recibido era OK (en este caso está almacenado en la variable Palabra2) y en todas funciona bien
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 13 de Enero de 2011, 10:20:39
Si comento la linia que lee los datos del puerto serie no da ningun error. Al final que crees que es mejor usar, la funcion cgets o la usart?
Ahora mismo tengo el programa asi:

Código: [Seleccionar]
char Palabra2[2];
const char * ComandoIdeal = "OK";
char * ComandoRecibido;
char resultado = 10;

Código: [Seleccionar]

//Primer comando AT

putst ("AT/n");
LED0=1;
LED1=1;
//Comprovar que reciba  "OK"
 while (getch_available() != false){ //Si hay un caracter disponible recibido por el puerto serie
LED0=0;
LED1=0;
LED2=1;
LED3=1;
if(getch_available()==true)
{
ComandoRecibido = Palabra2;
//cgets(ComandoRecibido);
resultado = strcmp (ComandoIdeal, ComandoRecibido);


if(resultado==0){ // Iguales
error_comando=0;
LED2=0;
LED3=0;
}
else
    error_comando=1;
  LED2=0;
LED3=0;
}
}

Voy haciendo que se enciendan los leds para que cuando grabe en la placa pueda ver facilmente donde esta el error.
Voy a mirar la funcion para leer, hechale un hojo si puedes y despues comentamos la jugada

Gracias de antemano amigo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 13 de Enero de 2011, 14:42:51
He encontrado una definicion para leer una cadena de longitud fija. No hay la funcion implementada pero si los parametros que se le pasan.
Código: [Seleccionar]
void getsUSART(unsigned char * buffer,unsigned char length );

Código: [Seleccionar]
Return Value: None
Remarks: This function only works in 8-bit transmit/receive mode. This function waits
for and reads len number of characters out of the specified USART. There is
no time out when waiting for characters to arrive. getsUSART should be used
on parts with a single USART peripheral. gets1USART and gets2USART
should be used on parts with multiple USART peripherals.

Filename: ugets.c
Code Example: char string[10];
getsUSART(string, 5);

Voy a mirar si funciona...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 14 de Enero de 2011, 20:49:01
  En el caso del programa que mostraste en el mensaje anterior (en el que hacés uso de cgets) dicha función te da error porque le estás pasando un puntero como parámetro. Si mirás el ejemplo que mostraste primero (sacado el manual de HiTech) hay que pasarle un arrary a caracteres.

  Osea que tendrías que hacer algo como lo que había hecho yo.... básicamente sería...

Código: C
  1. char buffer[10];  // esto es lo que va para cgets
  2. char * ComandoRecibido; // este es el puntero y lo voy a usar para strcmp
  3.  
  4. ComandoRecibido = buffer; // el puntero apunta al valor almacenado por buffer
  5.  
  6. cgets (buffer);
  7.  
  8. strcmp (ComandoRecibido, "OK");
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 14 de Enero de 2011, 21:18:51
Gracias de nuevo. He hecho esto y sigue sin funcionar: Pongo la parte de declaracion de las variables tambien:
Me dice que la variable comandorecibido esta dos veces declarada si apunto la variable al buffer. Para probar el proyecto podria usar el VTERM no? mirar si recibo un comando at y contestarle yo mismo el "OK" no? Cuando salga para un comando ya solo es cambiarlo para los otros. Pongo el codigo:

Código: [Seleccionar]

#include <htc.h>
#include <stdlib.h>  // para poder usar la funcion itoa
#include <conio.h>
#include <string.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);
 
/* =================================================================================
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;

char buffer[10];  // esto es lo que va para cgets
char * ComandoRecibido; // este es el puntero y lo voy a usar para strcmp
char resultado;
//ComandoRecibido = buffer;

/* =================================================================================
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);
 
/* =================================================================================
Main function
  ================================================================================= */
 
void main(void)
{
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 ComandoRecibido = buffer;

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


//Primer comando AT

putst ("AT/n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);

resultado = strcmp (ComandoRecibido, "OK");
if(resultado==0){ // Iguales
error_comando=0;

}
else
    error_comando=1;
}
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 15 de Enero de 2011, 10:02:18
  Hice la prueba de compilar un programita (para pic16f876a) con la función cgets() y me salió el siguiente error "Error[499] 0 : undefined symbol: _getche(PruebaCadenas.obj)".

  Por lo que entiendo, la función cgets hace uso de getche() pero ésta otra función no está implementada por el compilador sino que la tendría que hacer uno mismo.

  De hecho, lo mismo me ocurrió cuando quise hacer uso de cputs() (que es una función que tiene el compilador). Ésta función hace uso de putch, pero si yo no incluía mi propia función putch me daba el mismo error.

  Voy a probar de implementar una función y llamar getche a ver que pasa.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 15 de Enero de 2011, 10:03:56
Si, a mi tambien me salia este error. Yo voy a probar de usar la otra funcion o a ver si encuentro alguna otra.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 15 de Enero de 2011, 12:10:49
  Hice la prueba de implementar una función llamada getche y funcionó bien simulándolo en Proteus. Use el VirtualTerminal para ser yo quien genere la supuesta respuesta del dispositivo

  Así quedó definida la función...
Código: C
  1. unsigned char getche (void)
  2.   {
  3.     while (RCIF != 1)
  4.     {
  5.        clear_error;
  6.        CLRWDT();
  7.     }
  8.     return RCREG;
  9.   }

  Este es el programita de prueba que use en un PIC16F876A

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6.  
  7. __CONFIG (HS & LVPDIS & WDTDIS);
  8.  
  9. #include "Def16f87xa.h"  // estas son unas definiciones que hice para el manejo del PIC
  10.  
  11. #define PIC_CLK 10000000
  12. #define BAUD 9600
  13. #define BRGH_VALUE 1
  14.  
  15. #include "HardUart16.c"  // mis rutina de comunicacion RS232
  16.  
  17.  
  18. void main(void)
  19. {
  20.   char entrada[10];
  21.   char * ComandoRecibido;
  22.  
  23.   TRISC = 255;
  24.   InitHardUart (TRANSMIT | RECEIVE);
  25.   ComandoRecibido = entrada;  
  26.   while (1)
  27.   {
  28.     putst ("ATS=0\n");
  29.     cgets (entrada);
  30.     if (strcmp(ComandoRecibido,"OK") == 0) putst ("Respuesta correcta");
  31.     else
  32.       putst ("Respuesta incorrecta");
  33.     putch ('\r');
  34.   }
  35. }

  Te adjunto una captura de pantalla en donde se ve que a un ok en minúscula responde en forma incorrecta y a un OK en mayúscula responde en forma correcta.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 15 de Enero de 2011, 13:42:40
Muchas gracias

Una pregunta, la variable clear_error que pinta en la funcion? no esta declarada ni es ninguna funcion porque no tiene los "()". He mirado en mi codigo y habia una funcion igual a esta getche que se llama getch. Sigue sin funcionarme.. lo del clear_error lo he sustituido por el equivalente en mi programa cleart_usart_errors_inline. Lo que me extraña es que no reciba ni el "AT" correspondiente ni se enciendan los leds..

Seguire investigando, dejo el 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>


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

char buffer[10];  // esto es lo que va para cgets
char * ComandoRecibido; // este es el puntero y lo voy a usar para strcmp
char resultado;


/* =================================================================================
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);
 
/* =================================================================================
Main function
  ================================================================================= */
 
void main(void)
{
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 ComandoRecibido = buffer;

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



//Primer comando AT

putst ("AT\n");
LED0=1;
LED1=1;

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}


/*

//Segundo comando AT
if (error_comando==0)
{

error_comando=1;
putst ("ATS0=1\n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}


//Tercer comando AT
if (error_comando==0)
{
error_comando=1;
putst ("ATS512=4\n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}


//Quarto comando AT
if (error_comando==0)
{
error_comando=1;
putst ("ATS502=1/n");
LED0=1;
LED1=1;
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}



//Quinto comando AT
if (error_comando==0)
{
error_comando=1;
putst ("ATS536=1/n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}


//Sexto comando AT
if (error_comando==0)
{
error_comando=1;
putst ("AT+BTK=1234/n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}

//Septimo comando AT
if (error_comando==0)
{
error_comando=1;
putst ("AT&W/n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}



//Octavo comando AT
if (error_comando==0)
{
error_comando=1;
putst ("ATZ/n");
LED0=1;
LED1=1;

//Comprovar que reciba  "OK"
 while (getch_available() != false){ // Este while hay que ponerlo? Puede ser que haya un pequeño tiempo donde aun no haya recibido el caracer?

if(getch_available()==true)
{
LED0=0;
LED1=0;
LED2=1;
LED3=1;

cgets(buffer);
if (strcmp(ComandoRecibido,"OK") == 0)
error_comando=0;
else
    error_comando=1;
}
}


*/







 


 


 


 








/*
// El otro dispositivo se quiere connectar con nosotros
 
// Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres)
 
if((getch_available()==true)&&(error_comando==0))
{   
   cgets(Palabra1_real);
  resultado = strcmp (Palabra1_ideal, Palabra1_real);
  if(resultado==0)
error_comando=0;
  else
    error_comando=1;
 
}
}

// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres)

if((getch_available()==true)&&(error_comando==0))
{   
   cgets(Palabra2_real);
  resultado = strcmp (Palabra2_ideal, Palabra2_real);
  if(resultado==0)
error_comando=0;
  else
    error_comando=1;
 
}
}

// Mensaje de connexion: CONNECT 008098E6A5F4,1101 A  (27 caracteres)

if((getch_available()==true)&&(error_comando==0))
{   
   cgets(Palabra3_real);
  resultado = strcmp (Palabra3_ideal, Palabra3_real);
  if(resultado==0)
error_comando=0;
  else
    error_comando=1;
 
}
}





*/








  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();
 
while(1)
  {
   
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
  }
}
 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
    //   clear_error;
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}


 





Muchas gracias de antemano
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 15 de Enero de 2011, 20:57:38
  Yo hice la función getche idéntica a mi rutina getch. Ese "clear_error" es para borrar los bits OERR y FERR.
  No veo que inicialices el uart.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 16 de Enero de 2011, 05:52:46
Hay que volver a inicializar el uart? Antes de hacer ese cambio ya estaba inicializado con la funcion serial_setup y en la funcion de inicializacion habia el TRISC correspondiente.
Ya me diras algo

Muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 16 de Enero de 2011, 10:12:45
Hay que volver a inicializar el uart? Antes de hacer ese cambio ya estaba inicializado con la funcion serial_setup y en la funcion de inicializacion habia el TRISC correspondiente.
Ya me diras algo

Muchas gracias.

  Había mirado mal, si llamás a serial_setup(); pero tenés que llamar a dicha función antes de querer usar los comando AT y todo eso. Vos estás llamándola después.

   Recordá que con los dispositivos te estás comunicando vía RS232, así que entes de hacer uso de cualquier función que trabaje con dicho puerto y/o periférico, hay que inicializarlo en el PIC.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 16 de Enero de 2011, 14:40:50
Muchas gracias. Que fallo tan tonto..

Ahora mismo ya me funciona todo. Hasta los tres ultimos mensajes ( el PAIR 0.., RING.. y CONNECT). Mñana probrare en el PIC pero esta vez dudo que no funcione a la primera. Me da buena espina.
Cuando lo tenga funcionando en el PIC colgare el codigo.

En fin, muchas gracias Angel. Mañana sigo informandote de la situacion
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 08:54:58
Hola de nuevo, estoy probando esto y no funciona. He estado probando con LEDS para saber donde esta el error y esta en la linea:
cgets(buffer1). Creo que lo hacemos mal porque con esta funcion leemos las respuestas del modulo Bluetooth y como bien dije en un post anterior

"Todas las respuestas van con retorno de carro y caracteres de salto de linea ANTES  y DESPUES  de la respuesta"

All responses from ezurio device have carriage return and linefeed characters preceding and appending the response. These dual character sequences have the values 0x0D and 0x0A respectively and shall be represented by the string <cr,if>

Pongo el 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>


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

char buffer1[10];  // esto es lo que va para cgets
char * ComandoRecibido1; // este es el puntero y lo voy a usar para strcmp
char buffer2[10]; 
char * ComandoRecibido2;
char buffer3[10]; 
char * ComandoRecibido3;
char buffer4[10]; 
char * ComandoRecibido4;
char buffer5[10]; 
char * ComandoRecibido5;
char buffer6[10]; 
char * ComandoRecibido6;
char buffer7[10]; 
char * ComandoRecibido7;
char buffer8[10]; 
char * ComandoRecibido8;
char buffer9[100]; 
char * ComandoRecibido9;
char buffer10[100]; 
char * ComandoRecibido10;
char buffer11[100]; 
char * ComandoRecibido11;


/* =================================================================================
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);
 
/* =================================================================================
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\n");
LED0=0;
//if(getch_available()==true){

if(prueba==1) // Prueba para saber si llega hasta aqui.
LED1=1;
else
LED2=1;


cgets(buffer1);
LED1=1;

if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");
cgets(buffer1);
if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}




//Segundo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer2);

if (strcmp(ComandoRecibido2,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS0=1\n");
cgets(buffer2);
if (strcmp(ComandoRecibido2,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Tercer comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer3);

if (strcmp(ComandoRecibido3,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS512=4\n");
cgets(buffer3);
if (strcmp(ComandoRecibido3,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quarto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer4);

if (strcmp(ComandoRecibido4,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS502=1\n");
cgets(buffer4);
if (strcmp(ComandoRecibido4,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quinto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer5);

if (strcmp(ComandoRecibido5,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS536=1\n");
cgets(buffer5);
if (strcmp(ComandoRecibido5,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Sexto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer6);

if (strcmp(ComandoRecibido6,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT+BTK=1234\n");
cgets(buffer6);
if (strcmp(ComandoRecibido6,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}



//Septimo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer7);

if (strcmp(ComandoRecibido7,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT&W\n");
cgets(buffer7);
if (strcmp(ComandoRecibido7,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Octavo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer8);

if (strcmp(ComandoRecibido8,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATZ\n");
cgets(buffer8);
if (strcmp(ComandoRecibido8,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}







// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres)
ComandoRecibido9=buffer9;
cgets(buffer9);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres)
ComandoRecibido10=buffer10; 
cgets(buffer10);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer10);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A
ComandoRecibido11=buffer11; 
cgets(buffer11);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer11);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




while(1){
   
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
}

}


 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
   
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}


 





Voy a seguir mirando.. ayudenme por favor
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 09:05:26
Da la sensacion como si no entrara dentro de buffer1. Que puede succeder para que no entre en dicha funcion? Tendria que entrar almenos.. si lee el caracter bien o mal ya es otra cosa pero entrar creo que deberia.

Es como si no la terminara y estuviera dentro suyo. He leido que la funcion se acaba cuando encuentra una combinacion de retorno de carro y salto de linea ( como en nuestro caso) o cuando el tamaño del buffer termina. Puede ser un programa de longitud del buffeR? no creo.. porque esta declarado como buffer1[10]

P.D: Me gustaria ver los carácteres que recibo.. de esta forma podria detectar donde esta el error.

Muchas gracias de antemano.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 09:49:08
  Para poder ver los caracteres que recibís se puede hacer lo siguiente. Creas tu propia función para recibir las respuestas, pero haciendo uso de llamadas sucesivas a getch, en teoría deberían ser 6 llamadas, y almacenás todo eso en una variable. Luego basta con visualizar los datos almacenados en dicha variable y ya sabés como es que te responde el módulo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 09:54:06
En principio cual crees que podria ser el error?
Ahora miro de crear una funcion.. Esta funcion tiene que hacer 6 llamadas a la getchar y almacenar cada caracter en una variable no? tendre que ir cogiendo cada caracter del buffer no?

Edito: tambien podria hacer un while no?

Edito1: El problema esta en que el programa no avanza de la sentencia cgets.. entonces no podre leerlo..
Es eso lo que me extraña, que no siga aunque lo haga mal
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 09:59:10
En el caso que solucionasemos el tema de que el programa se queda parado en esa sentencia..
Podria hacer algo asi..

char c;
while((c = getche()) != ’\n’)
continue;

Con eso bastaria? Despues imagino que habria que usar la pusts..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 10:06:30
En principio cual crees que podria ser el error?
Ahora miro de crear una funcion.. Esta funcion tiene que hacer 6 llamadas a la getchar y almacenar cada caracter en una variable no? tendre que ir cogiendo cada caracter del buffer no?

  No tengo idea cual pueda ser el error.
  No es necesario que almacene cada caracter en una variable distinta, podés declararla así "char arreglo[10]" y cada caracter que vas leyendo lo almacenás en arreglo[indice];


Edito: tambien podria hacer un while no?

Edito1: El problema esta en que el programa no avanza de la sentencia cgets.. entonces no podre leerlo..
Es eso lo que me extraña, que no siga aunque lo haga mal

  Sí, sería conveniente usar un while para la función.
  No importa lo que está sucediendo con cgets ya que no se utilizaría más dicha función sino que vas a usar la tuya propia.

  Básicamente la función sería algo así...

Código: C
  1. {
  2.   char indice = 0;
  3.   do
  4.   {
  5.     arreglo[indice] = getch();
  6.     indice++;
  7.   }
  8.   while (indice < 6);
  9. }

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 10:13:36
Perdon,me he equivocado en una cosa. Ahora ya sale bien.
Pongo ese codigo como una funcion y llamo a la funcion o lo dejo asi?

Código: [Seleccionar]
//Primer comando AT

ComandoRecibido1=buffer1;
putst ("AT\n");
LED0=0;

do
{
buffer1[indice]=getch();
indice++;
}
while(indice < 6);


//cgets(buffer1);
LED1=1;


if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");
cgets(buffer1);
if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 10:27:49
He solucionado el error haciendo un return 0 pero ahora no funciona... Creo que debo retornar el buffer porque sino cuando pongo el caracter "O" antes de que ponga el otro caracter me da error.  Hago el return del buffer? ( ahora es como si solo leyera un caracter).

En la funcion he puesto indice <2 ya que tiene que leer el OK. Mirate a vr si esta bien... imagino que debo dejar algun espacio mas para el retorno de carro y el salto de linea..

dejo el codigo entero.

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);
  
/* =================================================================================
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[100];  // esto es lo que va para cgets
char * ComandoRecibido1; // este es el puntero y lo voy a usar para strcmp
char buffer2[10];  
char * ComandoRecibido2;
char buffer3[10];  
char * ComandoRecibido3;
char buffer4[10];  
char * ComandoRecibido4;
char buffer5[10];  
char * ComandoRecibido5;
char buffer6[10];  
char * ComandoRecibido6;
char buffer7[10];  
char * ComandoRecibido7;
char buffer8[10];  
char * ComandoRecibido8;
char buffer9[100];  
char * ComandoRecibido9;
char buffer10[100];  
char * ComandoRecibido10;
char buffer11[100];  
char * ComandoRecibido11;


/* =================================================================================
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);
 
unsigned leer_palabra(char * buffer);
/* =================================================================================
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\n");
LED0=0;

leer_palabra(buffer1);
//cgets(buffer1);
LED1=1;


if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");
leer_palabra(buffer1);
//cgets(buffer1);
if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}




//Segundo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer2);

if (strcmp(ComandoRecibido2,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS0=1\n");
cgets(buffer2);
if (strcmp(ComandoRecibido2,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Tercer comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer3);

if (strcmp(ComandoRecibido3,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS512=4\n");
cgets(buffer3);
if (strcmp(ComandoRecibido3,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quarto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer4);

if (strcmp(ComandoRecibido4,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS502=1\n");
cgets(buffer4);
if (strcmp(ComandoRecibido4,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quinto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer5);

if (strcmp(ComandoRecibido5,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS536=1\n");
cgets(buffer5);
if (strcmp(ComandoRecibido5,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Sexto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer6);

if (strcmp(ComandoRecibido6,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT+BTK=1234\n");
cgets(buffer6);
if (strcmp(ComandoRecibido6,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}



//Septimo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer7);

if (strcmp(ComandoRecibido7,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT&W\n");
cgets(buffer7);
if (strcmp(ComandoRecibido7,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Octavo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer8);

if (strcmp(ComandoRecibido8,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
   LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATZ\n");
cgets(buffer8);
if (strcmp(ComandoRecibido8,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}







// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres)
ComandoRecibido9=buffer9;
cgets(buffer9);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres)
ComandoRecibido10=buffer10;  
cgets(buffer10);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer10);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A
ComandoRecibido11=buffer11;  
cgets(buffer11);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer11);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




while(1){
    
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
}

}


 
/* =================================================================================
Function definitions
   ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
 error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
  putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                    

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations  
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.  
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP  
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;  
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;       //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;     //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;  
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;   //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
  
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
  
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
    
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}

unsigned leer_palabra(char * buffer)
{
do
{
buffer[indice]=getch();
indice++;
}
while(indice < 2);
return 0;
}



Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 12:16:46
..........
Código: [Seleccionar]

..........

unsigned leer_palabra(char * buffer)
{
do
{
buffer[indice]=getch();
indice++;
}
while(indice < 2);
return 0;
}

  El problema con hacer "while (indice < 2)" es que sólo va a tomar los dos primeros caracteres. Como vos bien dijeste, el módulo responde precediendo "CarrierReturn" y "LineFed" que son dos caracteres con lo cual ya saldrías de la función y sin almacenar la respuesta que te interesa.

  En todo caso se podría modificar la función para que evalue (con un if) si el caracter leído es distinto a "CarrierReturn" y distinto a "LineFed" y recién en ese caso almacenarlo en la variable.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 12:24:24
Ahora mismo lo estaba probando tal y como has puesto. Sigue sin funcionar.. te dejo el codigo, a lo mejor es una tonteria pero no se que pasa.

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);
 
/* =================================================================================
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[100];  // esto es lo que va para cgets
char * ComandoRecibido1; // este es el puntero y lo voy a usar para strcmp
char buffer2[10]; 
char * ComandoRecibido2;
char buffer3[10]; 
char * ComandoRecibido3;
char buffer4[10]; 
char * ComandoRecibido4;
char buffer5[10]; 
char * ComandoRecibido5;
char buffer6[10]; 
char * ComandoRecibido6;
char buffer7[10]; 
char * ComandoRecibido7;
char buffer8[10]; 
char * ComandoRecibido8;
char buffer9[100]; 
char * ComandoRecibido9;
char buffer10[100]; 
char * ComandoRecibido10;
char buffer11[100]; 
char * ComandoRecibido11;


/* =================================================================================
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);
 
unsigned leer_palabra(char * buffer);
/* =================================================================================
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\n");
LED0=0;

leer_palabra(buffer1);

LED1=1;


if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
LED0=1;
LED1=1;
LED2=1;
LED3=1;

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");
leer_palabra(buffer1);
//cgets(buffer1);
if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}




//Segundo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer2);

if (strcmp(ComandoRecibido2,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS0=1\n");
cgets(buffer2);
if (strcmp(ComandoRecibido2,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Tercer comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer3);

if (strcmp(ComandoRecibido3,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS512=4\n");
cgets(buffer3);
if (strcmp(ComandoRecibido3,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quarto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer4);

if (strcmp(ComandoRecibido4,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS502=1\n");
cgets(buffer4);
if (strcmp(ComandoRecibido4,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quinto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer5);

if (strcmp(ComandoRecibido5,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS536=1\n");
cgets(buffer5);
if (strcmp(ComandoRecibido5,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Sexto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer6);

if (strcmp(ComandoRecibido6,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT+BTK=1234\n");
cgets(buffer6);
if (strcmp(ComandoRecibido6,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}



//Septimo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer7);

if (strcmp(ComandoRecibido7,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT&W\n");
cgets(buffer7);
if (strcmp(ComandoRecibido7,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Octavo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;
//if(getch_available()==true)

cgets(buffer8);

if (strcmp(ComandoRecibido8,"OK") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATZ\n");
cgets(buffer8);
if (strcmp(ComandoRecibido8,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}







// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres)
ComandoRecibido9=buffer9;
cgets(buffer9);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres)
ComandoRecibido10=buffer10; 
cgets(buffer10);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer10);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A
ComandoRecibido11=buffer11; 
cgets(buffer11);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer11);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




while(1){
   
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
}

}


 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
   
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}

unsigned leer_palabra(char * buffer)
{
do
{
buffer[indice]=getch();
indice++;
}
while(indice < 10);
return 0;
}


Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 12:28:15
Ahora lo que pasa es que no detecta el final de la palabra. Tengo que acabar con un retorno de salto y un salto de linea.

Lo que pasa ahora es:
me pone el AT
contesto ok ( y no pone nada porque no ha llegado a los 10 caracteres)
contesto ok
.
.
.

Hasta que pone incorrecto.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 12:29:56
  Claro! porque hiciste "while (indice < 10)" entonces te quedás a la espera que el dispositivo te mande sí o sí 10 caracteres y es un error.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 12:34:33
Si este while es de 2, 3,4 tambien falla.. ese es el problema..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 12:41:06
  Fijate que en una de mis respuesta sugerí que había que utilizar un if para determinar si el caracter que llegaba era distinto de "retorno de carro" y distinto de "salto de linea" recién entonces almacenarlo en la variable.

  Seguramente otra de las cosas que está pasando es que, como se almacena todo en la variable (incluyendo los saltos de linea y retorno de carro), por ello falla la comparación. Osea, el valor que toma la variable es algo así "\r\fOK\r\f"
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 12:46:04
Si porque si pongo:
if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien

Y pongo un buffer de 2 y en la funcion el indice < 2 me pone al lado respuesta correcta pero si lo pongo de 3 me pone respuesta incorrecta ( porque coge alguno de estos caracteres raros).

Que propones? hacer hasta que se encuentre un retorno de carro?

Como son el retorno de carro y el salto de linea: El retorno de carro es \n no? es que veo tu \r y \f en el anterior post...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 12:49:42
Si pongo el buffer y el indice a 3 y en el terminal pongo OK + enter
En la condicion pongo OK\r y funciona!!

Lo que no funciona es que si fallo y pongo ok por ejemplo, pone respuesta incorrecta y solo me deja poner un caracter... sabes que puede ser?

Muchas gracias por la ayuda amigo. Te dejo q me contestes estas preguntas que sino voy demasiado rapido jej
Gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 13:18:29
Creo que sera mas facil que nos centremos con la funcion cgets. Podemos seguir con esto para ver lo que se recibe.
En teoria dices que se recibe algo como "\r\fOK\r\f" entonces que tendria que poner el la condicion del strcmp?

Es que no se por donde tirar la verdad... se esta complicando una cosa que pensaba que ya tenia..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 13:52:54
Código: [Seleccionar]
All responses from the EZURiO device have carriage return and linefeed characters preceding and appending the response. These dual character sequences have the values 0x0D and 0x0A respectively and shall be represented by the string <cr,lf>.

  Sito un mensaje tuyo en el cual queda bien claro cuales son los valores que representan el "Salto de linea" y el "Retorno de carro". Esto por un lado.

Si pongo el buffer y el indice a 3 y en el terminal pongo OK + enter
En la condicion pongo OK\r y funciona!!

Lo que no funciona es que si fallo y pongo ok por ejemplo, pone respuesta incorrecta y solo me deja poner un caracter... sabes que puede ser?

Muchas gracias por la ayuda amigo. Te dejo q me contestes estas preguntas que sino voy demasiado rapido jej
Gracias

  Me imagino que ya sólo te deja meter un caracter porque como la variable "indice" la tenés definida como global, sigue manteniendo el valor con el que se quedó anteriormente. Por lo tanto, en tu función "leer_palabra" y antes del ciclo do-while deberías poner "indice = 0".

  En el caso de la simulación con proteus o el uso de algún terminal (emulando el módulo) está bien que el while evalúe un índice < 3 -Por que en el terminal typeas O K Enter que son tres caracteres- pero tu dispositivo te envía 6 caracteres y estos serían 0x0D 0x0A O K 0x0D 0x0A
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 16:19:08
Gracias de nuevo. He puesto el indice a 0 y ahora voy enviando los comandos y poniendo a OK. Cuando llego al 4arto le doy a OK y me pone respuesta incorrecta. Mi sorpresa ha sido cuando he comentado los anteriores y he hecho como si solo estuviera este y ha funcionado.. Creo que se le mete algun caracter raro entre medias..

Que puede ser?

Creo que la otra funcion es mejor que esta.. esta creo que petara mas de una vez.. Depende mucho del valor exacto del buffer.. sino ya falla.
Dejo el codigo por si puede servir de algo:
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);
 
/* =================================================================================
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[3];  // esto es lo que va para cgets.
char * ComandoRecibido1; // este es el puntero y lo voy a usar para strcmp
char buffer2[3]; 
char * ComandoRecibido2;
char buffer3[3]; 
char * ComandoRecibido3;
char buffer4[3]; 
char * ComandoRecibido4;
char buffer5[3]; 
char * ComandoRecibido5;
char buffer6[3]; 
char * ComandoRecibido6;
char buffer7[3]; 
char * ComandoRecibido7;
char buffer8[3]; 
char * ComandoRecibido8;
char buffer9[100]; 
char * ComandoRecibido9;
char buffer10[100]; 
char * ComandoRecibido10;
char buffer11[100]; 
char * ComandoRecibido11;


/* =================================================================================
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);
 
unsigned leer_palabra(char * buffer);
/* =================================================================================
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\n");
LED0=1;

leer_palabra(buffer1);

LED1=1;


if (strcmp(ComandoRecibido1,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
LED0=1;
LED1=1;
LED2=1;
LED3=1;

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");
//leer_palabra(buffer1);
cgets(buffer1);
LED0=1;
LED1=1;
LED2=1;
LED3=1;
if (strcmp(ComandoRecibido1,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}





//Segundo comando AT

ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;

leer_palabra(buffer2);

LED1=1;


if (strcmp(ComandoRecibido2,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
LED0=1;
LED1=1;
LED2=1;
LED3=1;

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS0=1\n");
leer_palabra(buffer2);
//cgets(buffer1);
if (strcmp(ComandoRecibido2,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}

*/


//Tercer comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;
//if(getch_available()==true)

//cgets(buffer3);
leer_palabra(buffer3);
if (strcmp(ComandoRecibido3,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS512=4\n");
//cgets(buffer3);
leer_palabra(buffer3);
if (strcmp(ComandoRecibido3,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Quarto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;
//if(getch_available()==true)

//cgets(buffer3);
leer_palabra(buffer4);
if (strcmp(ComandoRecibido4,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS502=1\n");
//cgets(buffer3);
leer_palabra(buffer4);
if (strcmp(ComandoRecibido4,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}







//Quinto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;
//if(getch_available()==true)

//cgets(buffer5);
leer_palabra(buffer5);
if (strcmp(ComandoRecibido5,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATS536=1\n");
//cgets(buffer5);
leer_palabra(buffer5);
if (strcmp(ComandoRecibido5,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Sexto comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;
//if(getch_available()==true)

leer_palabra(buffer6);
//cgets(buffer6);

if (strcmp(ComandoRecibido6,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT+BTK=1234\n");
//cgets(buffer6);
leer_palabra(buffer6);
if (strcmp(ComandoRecibido6,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}



//Septimo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;
//if(getch_available()==true)
//cgets(buffer7);
leer_palabra(buffer7);

if (strcmp(ComandoRecibido7,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("AT&W\n");
//cgets(buffer7);
leer_palabra(buffer7);
if (strcmp(ComandoRecibido7,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}


//Octavo comando AT
LED0=0;
LED1=0;
LED2=0;
LED3=0;
ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;
//if(getch_available()==true)
leer_palabra(buffer8);
//cgets(buffer8);

if (strcmp(ComandoRecibido8,"OK\r") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
LED0=1;
LED1=1;
LED2=1;
LED3=1;
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea
LED0 = 0;
  LED1 = 0;
  LED2 = 0;
LED3 = 0;
putst ("ATZ\n");
//cgets(buffer8);
leer_palabra(buffer8);
if (strcmp(ComandoRecibido8,"OK\r") == 0){
error_comando=0;
putst ("respuesta correcta");
LED3=1;
putst ("\n");  //cambio de linea
}
}
}






/*
// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres+4)
ComandoRecibido9=buffer9;
cgets(buffer9);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres)
ComandoRecibido10=buffer10; 
cgets(buffer10);

if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer10);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A
ComandoRecibido11=buffer11; 
cgets(buffer11);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

cgets(buffer11);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}
*/



while(1){
   
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
}

}


 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
   
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}

unsigned leer_palabra(char * buffer)
{
indice = 0;
do
{
buffer[indice]=getch();
indice++;
}
while(indice < 3); // Cambiar a 6 para el dispositivo
return 0;
}


Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 16:30:50
Y entonces.. para poder ver lo que estoy recibiendo puedo enviar  esto no?
putst(ComandoRecibido1);

Ya que a la funcion putst hay que pasarle el puntero...

Por otro lado, si uso la funcion cgets y como condicion pongo el "0x0D 0x0A O K 0x0D 0x0A"??? Creo que la mejor opcion es hacerlo con esta funcion.
Ayudame por favor


Gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 17:19:57
  Te muestro un ejemplo de la implementación con los if que te proponía. Está todo el programita, lo que hace es un while donde envío una y otra vez el string "ATS=0" y voy contestando. Como no sé como envíar un "LineFeed" uso un "Enter" en el VirtualTerminal. Osea que mi respuesta -emulando el dispositivo- es Enter Enter O K Enter Enter, que son los 6 caracteres que enviaría tu dispositivo.

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6.  
  7. __CONFIG (HS & LVPDIS & WDTDIS);
  8.  
  9. #include "Def16f87xa.h"
  10.  
  11. #define PIC_CLK 10000000
  12. #define BAUD 9600
  13. #define BRGH_VALUE 1
  14.  
  15. #include "HardUart16.c"
  16.  
  17. void leer_respuesta (char * palabra)
  18. {
  19.   char indice = 0;
  20.   char CaracterLeido;
  21.  
  22.   do
  23.   {
  24.     CaracterLeido = getch();
  25.     if ((CaracterLeido != '\f') && (CaracterLeido != '\r'))
  26.     {
  27.       *palabra = CaracterLeido;
  28.       *palabra++;
  29.     }
  30.     indice++;
  31.   }
  32.   while (indice < 6);
  33. }
  34.  
  35.  
  36. #pragma psect maintext=cuerpo
  37. void main(void)
  38. {
  39.   char entrada[10];
  40.   char * ComandoRecibido;
  41.  
  42.   TRISC = 255;
  43.   InitHardUart (TRANSMIT | RECEIVE);
  44.   ComandoRecibido = entrada;  
  45.   while (1)
  46.   {
  47.     putst ("ATS=0");
  48.     putch ('\r');
  49.  
  50.     leer_respuesta (ComandoRecibido);
  51. //    cgets (entrada);
  52.     if (strcmp(ComandoRecibido,"OK") == 0) putst ("Respuesta correcta");
  53.     else
  54.       putst ("Respuesta incorrecta");
  55.     putch ('\r');
  56.   }
  57. }

  Acá una captura de la pantalla, como se ve, responde bien a sucesivos comandos.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 17:49:05
Ahora si que me sale. Muchas gracias!
Entonces.. en mi caso que es retorno de carro, linefeed "OK" retorno carro.. voy a intentar modificarlo.

No entiendo bien dos lineas del codigo:

   *palabra = CaracterLeido;
                *palabra++;

Osea guardas en "palabra" los caracteres tipo retorno de carro etc.. pero porque lo guardas y porque haces *palabra++? Perdona si es que estoy pregunto una tonteria.. pero no lo entiendo.

Por otro lado he visto esto:

   if ((CaracterLeido != '\f') && (CaracterLeido != '\r'))

El caracter \r se refiere a retorno de carro pero el \f? Yo tengo que el lineefeed es \n.. me equivoco?

Muchas muchas muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 17:53:30
Me gustaria hacer una prueba y ver que es lo que recibo con un OK, como podria hacerlo..? Antes te he comentado una posible opcion creo..
seria leer como ahora estoy leyendo el dato y enviarlo yo al puerto serie con una pusts. Seria una manera?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 18:28:46
Acabo de grabarlo al PIC y sigue sin funcionar... nunca ejecuta mas alla del leer_respuesta(buffer1). Estoy "debugando" a partir de los LEDS y se me encienden los dos primeros ( que los hago encender antes de esta sentencia). Despues de esta enciendo otro que ya no va...

La verdad es que no se que hacer...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 19:29:40
Acabo de grabarlo al PIC y sigue sin funcionar... nunca ejecuta mas alla del leer_respuesta(buffer1). Estoy "debugando" a partir de los LEDS y se me encienden los dos primeros ( que los hago encender antes de esta sentencia). Despues de esta enciendo otro que ya no va...

La verdad es que no se que hacer...

  Según veo en el último programa que subiste, LED0 lo encendes antes de llamar a "leer_palabra" y LED1 lo encendes después, cuando salís de la función "leer_palabra". Por ende el problema podría estar después y no en la función.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 17 de Enero de 2011, 19:37:48
Muchas gracias. Si estuviera despues el Led se encendria o pasaria algo..
Dejo el codigo actual, es parecido al de antes pero he cambiado cosas de los leds.

No se me ocurre que puede pasar... pero con la funcion cgets esta mañana me pasaba lo mismo... a lo mejor no era que estuviera mal hecha sino que hay algo mal a continuacion.. El strcmp no tiene porque fallar.. entonces es que realmente no se q puede suceder

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);
 
/* =================================================================================
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];  // esto es lo que va para cgets.
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;


/* =================================================================================
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;
LED0=1;
putst ("AT\n");
time_delay(999999999);
LED1=1;


leer_respuesta(ComandoRecibido1);
LED0=0;
LED1=0;
LED2=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT\n");

leer_respuesta(ComandoRecibido1);

if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Segundo comando AT

ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;

leer_respuesta(ComandoRecibido2);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS0=1\n");

leer_respuesta(ComandoRecibido2);

if (strcmp(ComandoRecibido2,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Tercer comando AT

ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;

leer_respuesta(ComandoRecibido3);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS512=4\n");

leer_respuesta(ComandoRecibido3);

if (strcmp(ComandoRecibido3,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Quarto comando AT

ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;

leer_respuesta(ComandoRecibido4);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS502=1\n");

leer_respuesta(ComandoRecibido4);

if (strcmp(ComandoRecibido4,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Quinto comando AT

ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;

leer_respuesta(ComandoRecibido5);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS536=1\n");

leer_respuesta(ComandoRecibido5);

if (strcmp(ComandoRecibido5,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}



//Sexto comando AT

ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;

leer_respuesta(ComandoRecibido6);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT+BTK=1234\n");

leer_respuesta(ComandoRecibido6);

if (strcmp(ComandoRecibido6,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}



//Septimo comando AT

ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;

leer_respuesta(ComandoRecibido7);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT&W\n");

leer_respuesta(ComandoRecibido7);

if (strcmp(ComandoRecibido7,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}




//Octavo comando AT

ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;

leer_respuesta(ComandoRecibido8);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATZ\n");

leer_respuesta(ComandoRecibido8);

if (strcmp(ComandoRecibido8,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}
















/*


// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres) + 4 =23
ComandoRecibido9=buffer9;
//cgets(buffer9);
leer_palabra(buffer9,19);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

leer_palabra(buffer9,19);
//cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres) +4 =21
ComandoRecibido10=buffer10; 
//cgets(buffer10);
leer_palabra(buffer10,17);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

//cgets(buffer10);
leer_palabra(buffer10,17);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4
ComandoRecibido11=buffer11; 
//cgets(buffer11);
leer_palabra(buffer11,27);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

leer_palabra(buffer11,27);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}
*/



while(1){
   
time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();
//time_delay(1000000000);
}

}


 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 
unsigned char getch(void)
{
  while (RCIF != 1)
  { //1 = The EUSART receive buffer, RCREG, is full
    CLRWDT();
    clear_usart_errors_inline;
  }
  return RCREG;
}
//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty // Cuando no es RCIF, cuando no es 1
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
unsigned char getche (void)
{
    while (RCIF != 1)
    {
   
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}

//*****************************************************************************
//FUNCION Leer_palabra
//*****************************************************************************
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
do
{
CaracterLeido = getch();
if ((CaracterLeido != '\f') && (CaracterLeido != '\r'))
{
*palabra = CaracterLeido;
*palabra++;
}
indice++;
}
while(indice < 6); // Cambiar a 6 para el dispositivo
}


void leer_respuesta_dispositivo(char * palabra)
{
char indice = 0;
char CaracterLeido;
do
{
CaracterLeido = getch();
if ((CaracterLeido != '\f') && (CaracterLeido != '\r'))
{
*palabra = CaracterLeido;
*palabra++;

}
indice++;
}
while(indice < 6); // Cambiar a 6 para el dispositivo
}

Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 17 de Enero de 2011, 20:31:34
  Si se queda trabado en la función "leer_palabra" tal vez se deba a que estás esperando a recibir 6 caracteres pero el dispositivo no envía dicha cantidad.
  Se me ocurre que en vez de hacer uso de dicha función, uses varios getch y vayas variando el estado de LEDS cada vez que pasas por un getch, en uno se te va a quedar colgado y según el estado de los LEDS vas a poder saber en cual, por ende vas a saber cuantos caracteres te envió el dispositivo.
  Algo asi...

Código: C
  1. LED0 = 0;
  2. LED1 = 0;
  3. LED2 = 0;
  4. LED3 = 0;
  5. buffer[0] = getch();
  6. LED0 = 1; // pase bien la lectura del primer caracter
  7. buffer[1] = getch();
  8. LED0 = 0;
  9. LED1 = 1; // pase bien la lectura del segundo caracter
  10. // y asi hasta llegar a los 6 caracteres a ver que pasa
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 07:05:40
Hola de nuevo. Estoy probando eso que me dijiste con este codigo. He visto que entra en la funcion 2 veces por tanto he declarado el buffer y el indice a <2.
Dejo el codigo y sigo con la explicacion:
Código: [Seleccionar]
//Primer comando AT

ComandoRecibido1=buffer1;

putst ("AT\n");
LED0=1;
time_delay(999999999);

leer_respuesta(ComandoRecibido1);
LED1=1;
time_delay(999999999);

/*
LED0=0;
LED1=0;
LED2=0;
LED3=0;
time_delay(999999999);
buffer1[0]=getch();
LED0=1;
time_delay(999999999);
buffer1[1]=getch();
LED1=1;
time_delay(999999999);
buffer1[2]=getch();
LED2=1;
time_delay(999999999);
buffer1[3]=getch();
LED3=1;
time_delay(999999999);
buffer1[4]=getch();
LED0=0;
time_delay(999999999);
buffer1[5]=getch();
LED1=0;
time_delay(999999999);
*/

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


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

putst ("AT\n");

leer_respuesta(ComandoRecibido1);
/*
LED0=0;
LED1=0;
LED2=0;
LED3=0;
buffer1[0]=getch();
LED2=1;
buffer1[1]=getch();
LED3=1;
*/
if (strcmp(ComandoRecibido1,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');


}
}
}

Se me enciende el led0, el led 1 y el led 3. Este led 3 se enciende si hay un error en la comparacion con el caracter. Por tanto ahora el error esta en que no se tiene que comparar con un OK sino con otra cosa... lo que no entiendo es como solo recibe 2 caracteres

Ayuda por favor!

Muchas gracias de antemano.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 07:29:51
Realmente lo que falla es la comparacion con el "OK"
Estoy aquí:
Código: [Seleccionar]
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\n");

leer_respuesta(ComandoRecibido1);

/*
LED0=0;
LED1=0;
LED2=0;
LED3=0;
buffer1[0]=getch();
LED2=1;
buffer1[1]=getch();
LED3=1;
*/
if (strcmp(ComandoRecibido1,"OK") == 0){
LED3=1;
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
}
else
LED3=0;
}
}

Y nunca entre en la ultima parte..
Código: [Seleccionar]
if (strcmp(ComandoRecibido1,"OK") == 0){
LED3=1;
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
}


A ver si pueden ayudarme..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 07:58:13
Por curiosidad he cambiando el comando AT por un pusts("Hola") y sigo recibiendo 2 caracteres.. ahora ya si que es el colmo! no tendria que recibir nada ahora...

Todo ha venido a raiz de que he vuelto a leer que mis comandos van con un retorno de carro y yo los comandos los tenia como pusts("AT\n"). He visto que el retorno de carro era \r y por eso lo he cambiando.

Tambien he probado si el buffer1[0] era alguno de los caracteres ( "O","K", "\f","\n","\r")... y nada..
Ya no me explico nada... de verdad que ya no se que probar..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 09:21:42
Ya se donde falla el programa. Cuando envio el AT!!. La explicacion al post anterior es que cuando recibe un comando erroneo devuelve "ERROR 05", por eso devolvia caracteres.

Estoy probando desde el puerto serie del PIC al hyperterminal enviando distintos comandos y recibo esto:

Enviando AT\r    41 54 0D 0A
Enviando AT\f    41 54 0C
Enviando AT\n  41 54 0A 0D

Por lo tanto ahi estara el error. Lo que no entiendo es que en el primer caso por ejemplo.. envie solo retorno de carro y se le "sume" 0A que es lo de linefeed...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 09:49:33
Ya se donde falla el programa. Cuando envio el AT!!. La explicacion al post anterior es que cuando recibe un comando erroneo devuelve "ERROR 05", por eso devolvia caracteres.

Estoy probando desde el puerto serie del PIC al hyperterminal enviando distintos comandos y recibo esto:

Enviando AT\r    41 54 0D 0A
Enviando AT\f    41 54 0C
Enviando AT\n  41 54 0A 0D

Por lo tanto ahi estara el error. Lo que no entiendo es que en el primer caso por ejemplo.. envie solo retorno de carro y se le "sume" 0A que es lo de linefeed...

  Eso se debe a como es la implementación de la función putst(); Fijate....

Código: C
  1. //*****************************************************************************
  2. // Enviar datos (un buffer)
  3. //*****************************************************************************
  4. void putst(register const char *str)
  5. {
  6.   while ((*str) != 0)
  7.   {
  8.     putch (*str);
  9.    if (*str == 13) putch (10);
  10.     if (*str == 10) putch (13);
  11.     str++;
  12.   }
  13. }

  Supongamos que yo hago putst("Hola\n");
  Entonces mi función va a enviar cada caracter con la línea que dice "putch (*str)". Pero fijate que también hay un par de if, por lo tanto si el caracter enviado era el 10 también agrega el caracter 13 y si el caracter enviado era el 13 agrega el 10.

  Quizá habría que sacar esos dos if de la implementación de putst().

  Y En tu programa probá de enviar los comandos de la siguiente manera...

Código: C
  1. putst ("ATS=0");
  2. putch ('\r');

  Digo de ponerlo así porque en uno de los mensajes donde detallabas como respondía el dispositivo también agregabas...

"All commands are terminated by the carriage return character 0x0d, which is represented by the string <cr> in descriptions below this cannot be changed"

  y justamente el caracter '\r' toma el valor 0x0d.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 09:51:50
Ya esta si, me he imagino que era eso y ya lo habia cambiado. Ahora voy a mirar bien los caracteres que recibo bien con el "OK" y te cuento.

Gracias de todas formas
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 09:58:12
Ahora mismo no me entra en la funcion leer_palabra.. lo tengo declarado en 6..
Es posible que falle algo de la funcion o sera el buffer..?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 09:59:44
Ahora mismo no me entra en la funcion leer_palabra.. lo tengo declarado en 6..
Es posible que falle algo de la funcion o sera el buffer..?

  ¿Pero no entra a la función o no sale de ella?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 10:00:58
Como puedo testear eso?

Edito: No sale de ella, ya lo he probado.
Puedes explicarme estas dos lineas:

*palabra= CaracterLeido;
*palabra++;

Muchas gracias de nuevo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 10:24:44
La funcion funciona para buffer[2] e indice 2.
Eso quiere decir que recibo dos caracteres pero que no son "O" "K"

A lo mejor estoy recibiendo el retorno de carro y el linefeed.. antes d recibir el OK.
Que puede ser?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 11:02:27
Como puedo testear eso?

Edito: No sale de ella, ya lo he probado.
Puedes explicarme estas dos lineas:

*palabra= CaracterLeido;
*palabra++;

Muchas gracias de nuevo.

  Sí, ayer se me pasó explicarte eso y también el porque había probado con el caracter '\f' en su momento....

  Primero te explico lo de los caracteres que me es más fácil  :)
  Cuando estaba haciendo pruebas con el terminal virtual de proteus noté que al poner en mi programa "putch(''\n);" no hacía nada, entonces pensé que había algún error y empecé a probar distintas cosas hasta que con el '\f' paració funcionar pero luego -recién en la noche- noté que el caracter '\f' servía para borrar la pantalla del terminal virtual. Después de eso debugge el programa y vi que cuando ponía '\r' enviaba el dato 13 (0x0d) y al poner '\n' envía el dato 10 (0x0a).

  Ahora lo más complejo, espero que pueda hacerme entender  :?

  Es algo bastante complejo porque está relacionado con el uso de punteros. Cuando se trabaja con punteros se puede hacer uso de & o *. & se usa para referirse a una dirección de memoria y * se para referirse al un dato. A ver si con un ejemplo me explico mejor.

Código: C
  1. volatile char * puntero; // declaro una variable del tipo puntero
  2.  
  3. puntero = &PORTB; //hago que el puntero apunte a la direccion del puerto B
  4.  
  5. *puntero = 255; // esto cambia el dato que se encuentra en la direccion a la cual apunta el puntero

  A efectos prácticos, el "*puntero = 255;" pone a 255 el puerto B. El puntero apunta al puerto B, y al cambiar el dato de la dirección apuntada por el puntero, cambiamos el dato del puerto B.

 Ahora vamos al caso de mi función.

  con "*palabra = CaracterLeido" hago que el dato apuntado por el puntero sea el caracter leído
y con "*palabra++" incremento el índice del puntero.

  Esto es equivalente a, en un array ir aumentando el indice.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 11:08:10
Lo he entendido bien. Ahora hablare con mi profesor para ver si podemos conseguir observar que es lo que se envia con el "OK" de vuelta. Cuando lo sepamos espero que problema solucionado...

Por otra parte, entonces en la parte de la funcion que pone \f lo quito no? y lo sustituto por \n,  no?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 11:21:40
Lo he entendido bien. Ahora hablare con mi profesor para ver si podemos conseguir observar que es lo que se envia con el "OK" de vuelta. Cuando lo sepamos espero que problema solucionado...

Por otra parte, entonces en la parte de la funcion que pone \f lo quito no? y lo sustituto por \n,  no?

  Sí, exacto.
 
  También estaba pensando en otro formato para la función. Ya que si esperamos 6 caracteres pero el dispositivo sólo te envía un mensaje que contiene menos caracteres se te va a quedar colgada.
  El nuevo formato podría ser algo así...

Código: C
  1. // dejo pasar dos getch() porque serian los dos caracteres que preceden el mensaje del dispositivo
  2. do
  3. {
  4.   CaracterLeido = getch();
  5.   if ((CaracterLeido ! = '\r') && (CaracterLeido != '\n'))
  6.   {
  7.     *palabra = CaracterLeido;
  8.     *palabra++;
  9.   }
  10. // el if esta para no almacenar en la variable los caracteres de "CarrierReturn" y "LineFeed"
  11.  
  12.   *palabra = '\0'; // esto esta para asegurarme de terminar la variable con el carecter nulo, que es el utilizado para indicar el fin de un string
  13. }
  14. while (CaracterLeido != '\n');// solo sale del while cuando se recibe el "LineFeed" que seria el ultimo caracter enviado por el dispositivo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 11:55:02
Con esta nueva variante de la funcion me vuelvo a quedar dentro... he puesto un buffer de 10 porque ahora da igual el tamaño y me quedo dentro..

Edito: Creo que hay un error.. a cada lectura va poniendo *palabra = '\0'; no?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 15:06:21
Sabes de algun programa que me permita enviar los comandos AT y ver la respuesta entera del modulo? o que me permita verla en hexadecimal...

Gracias!
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 15:41:06
He encontrado un programa que me ha permitido saber que es lo que ocurre en la sequencia AT y contestacion "OK"
Exactamente copio textualmente del terminal

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a                    AT...OK...

De los cuales:

 41 54 0d correspoden a AT y el salto de carro
0d 0a 4f 4b 0d  |  0a 0a  corresponden al OK con todo lo que lleva.

Lo que no entiendo bien es que pinta esa "barra" que separa a los caracteres 0a 0a..

Lo entiendes tu, Angel?

Segun esto tanto pueden ser 5 6 7 o 8 caracteres. Lo he probado con todas las opciones y sigue sin funcionar...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 16:59:43
  ¿Esa secuencia que mostrás es toda la respuesta del dispositivo?

  No entiendo la barra. 0x0a es el código de "LineFeed" así que por lo que parece la respuesta terminaría con un doble "LineFeed"
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 17:12:25
Es eso lo que no entiendo bien. Yo pongo AT + enter y me devuelve todo eso...
Creo e imagino que la barra separara las palabras ( ya que son de 8bits). Si te fijas hay 8 bits la barra y dos mas
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 17:16:22
  Imagino que habrás querido decir 8 bytes, ya que 8 bits forman cada caracter.
¿Tendrás el datasheet del dispositivo o alguna dirección en donde poder verlo? Como para tratar de ver como tiene que responder
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 17:18:16
Perdon si, bytes.
Que quieres que mire en el datasheet exactamente?

En el datasheet viene toda la lista de comandos AT con la explicacion...
De la manera como contesta solo hay eso que te explique. Contesta con retorno de carro y linefeed antes y despues dl OK ( segun el datasheet). Aqui estamos viendo que no es asi..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 17:19:33
  No, lo quiero mirar yo para ver si puedo encontrar algo que se me esté escapando.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 17:20:41
Subo la info en un zip ok? Todo viene en un cd y no esta en ninguna pagina.

Edito: Mientras voy guardando toda la info para subirla te dejo una prueba que he hecho antes con ese terminal que me permite ver lo que recibo.
En esta prueba he puesto los 8 comandos ( at, ats0=1 etc...) el resultado es este:

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a 41 54 53 30 3d 31  AT...OK...ATS0=1
00000010: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 31 32 3d 34  ...OK...ATS512=4
00000020: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 30 32 3d 31  ...OK...ATS502=1
00000030: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 33 36 3d 31  ...OK...ATS536=1
00000040: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 2b 42 54 4b 3d 22  ...OK...AT+BTK="
00000050: 31 32 33 34 22 0d 0d 0a  |  4f 4b 0d 0a 0a 41 54 26  1234"...OK...AT&
00000060: 57 0d 0d 0a 4f 4b 0d 0a  |  0a 41 54 5a 0d 0d 0a 4f  W...OK...ATZ...O
00000070: 4b 0d 0a                         

Edito otra vez: No puedo subir la info porque el documento ( comprimido) tiene mas de 250kb. Si me puedes dar tu correo por privado te lo envio todo. Es que ese es solo un documento de unos quantos que hay.
Dime de que manera quieres hacerlo sino.


Muchas gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 20:15:44
Sigue sin salir de la funcion...
He probado esto ( sabiendo que se reciben 7 caracteres)
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{   
   
   CaracterLeido = getch();
   
   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      LED1=1;
      *palabra = CaracterLeido;
      *palabra++;
   }
   //*palabra = '\0';
   indice++;
   //LED2=1;
}
   //while (CaracterLeido != '\n'); //\n
   while(indice<7);
   LED2=1;
}


Y se queda dentro del bucle siempre...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 20:25:14
He añadido una variable "cont" para saber el numero de veces que entraba dentro del if y he comprobado que eran dos, por lo que eso esta bien. El error es que no sale del bucle creo.. seguire probando..

En cambio.. cuando hago una prueba para ver cuantos caracteres son \r o \n de esta forma:
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{   
   
   CaracterLeido = getch();
   
   if((CaracterLeido =='\r')||(CaracterLeido=='\n'))
   cont++;

   if (cont==0)
   LED1=1;
    else
    LED2=1;

   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      
      *palabra = CaracterLeido;
      *palabra++;
      
   }
   //*palabra = '\0';
   indice++;
   
   time_delay(999999999999999);


}
   //while (CaracterLeido != '\n'); //\n
   while(indice<7);
   //LED2=1;
}

Me sale que es con cont==0, osea.. que nunca entra..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 18 de Enero de 2011, 20:44:10
Segun otra prueba solo se reciben 2 caracteres diferentes a "O" o a "K". Es como si hiciera bien el \n\fOK y a partir de aqui ya no viera mas datos.
Voy colgando el codigo de las pruebas que hago:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{

CaracterLeido = getch();

if((CaracterLeido !='O')&&(CaracterLeido!='K'))
cont++;


if(cont==1)
LED1=1;

if (cont==2)
LED2=1; 
   
if(cont==3)
LED3=1;

if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{

*palabra = CaracterLeido;
*palabra++;

}
//*palabra = '\0';
indice++;

time_delay(999999999999999);


}
//while (CaracterLeido != '\n'); //\n
while(indice<7);
//LED2=1;
}

Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 18 de Enero de 2011, 22:56:13
  Podés subir el archivo a algún servidor de almacenamiento y pasarme el link. Puede ser Megaupload, Rapidshare. 4shared.... hay varios sitios

  Qué extraños está todo, no siempre responde de la misma manera... te devuelve el comando que mandaste.... está bastante complejo el asunto.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 06:32:21
No devuelve el comando que mande, lo devuelve bien!
fijate:

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a 41 54 53 30 3d 31  AT...OK...ATS0=1
00000010: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 31 32 3d 34  ...OK...ATS512=4
00000020: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 30 32 3d 31  ...OK...ATS502=1
00000030: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 33 36 3d 31  ...OK...ATS536=1
00000040: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 2b 42 54 4b 3d 22  ...OK...AT+BTK="
00000050: 31 32 33 34 22 0d 0d 0a  |  4f 4b 0d 0a 0a 41 54 26  1234"...OK...AT&
00000060: 57 0d 0d 0a 4f 4b 0d 0a  |  0a 41 54 5a 0d 0d 0a 4f  W...OK...ATZ...O
00000070: 4b 0d 0a       

Esta sequencia marcada en negrita es el "OK" con el retorno de carro etc.. y como ves se va repitiendo. Esta claro que la contestacion del modulo es lo que hay en negrita.

Si te fijas tambien todos los comndos empiezan por AT, por lo que tambien se ve ahi. Fijate que AT es 41 54 y tambien se va repitiendo en todos.
Eso esta bien. Lo hay que hacer es que acabe de leer la funcion cuando se encuentre a dos 0a 0a

Te dejo el link de donde estan colgados los docs: http://www.filefactory.com/file/b51043c/n/Documentos.zip
En el documento "blue2i Quick Start Guide" en la pagina 8 esta el ejemplo de comandos AT que utilizo.
En el documento "AT command Set" en la pag 5 esta la explicacion de lo que envia el modulo y lo que recibe.


Muchas gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 08:04:22
No entiendo muchas cosas...
Cuando hago las diferentes llamandas a la funcion getch con:
Código: [Seleccionar]

LED0=0;
LED1=0;
LED2=0;
LED3=0;
buffer1[0]=getch();
LED0=1;
buffer1[1]=getch();
LED1=1;
buffer1[2]=getch();
LED2=1;
buffer1[3]=getch();
LED3=1;
buffer1[4]=getch();
LED0=0;
buffer1[5]=getch();
LED1=0;
buffer1[6]=getch();
LED2=0;

Se me encienden los dos primeros leds, con lo que pienso que hay 2 caracteres.

En cambio ayer me puse dentro de la funcion leer_palabra que va llamando a getch y vi que entraba dos veces en el if ( una para la "O" y otra para la "K") y que tambien no entraba mas de una vez por lo que SI que hay mas de 2 caracteres...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 19 de Enero de 2011, 10:21:57
No devuelve el comando que mande, lo devuelve bien!
fijate:

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a 41 54 53 30 3d 31  AT...OK...ATS0=1
00000010: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 31 32 3d 34  ...OK...ATS512=4
00000020: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 30 32 3d 31  ...OK...ATS502=1
00000030: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 33 36 3d 31  ...OK...ATS536=1
00000040: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 2b 42 54 4b 3d 22  ...OK...AT+BTK="
00000050: 31 32 33 34 22 0d 0d 0a  |  4f 4b 0d 0a 0a 41 54 26  1234"...OK...AT&
00000060: 57 0d 0d 0a 4f 4b 0d 0a  |  0a 41 54 5a 0d 0d 0a 4f  W...OK...ATZ...O
00000070: 4b 0d 0a       

Esta sequencia marcada en negrita es el "OK" con el retorno de carro etc.. y como ves se va repitiendo. Esta claro que la contestacion del modulo es lo que hay en negrita.

Si te fijas tambien todos los comndos empiezan por AT, por lo que tambien se ve ahi. Fijate que AT es 41 54 y tambien se va repitiendo en todos.
Eso esta bien. Lo hay que hacer es que acabe de leer la funcion cuando se encuentre a dos 0a 0a

Te dejo el link de donde estan colgados los docs: http://www.filefactory.com/file/b51043c/n/Documentos.zip
En el documento "blue2i Quick Start Guide" en la pagina 8 esta el ejemplo de comandos AT que utilizo.
En el documento "AT command Set" en la pag 5 esta la explicacion de lo que envia el modulo y lo que recibe.


Muchas gracias

  ¿Entonces toda esa información es como un log de lo que pasa en la terminal que estás usando. Tanto lo que vos mandás como lo que te envía el dispositivo?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 10:27:55
Si. Ahora mismo esos comandos AT los envio por el hyperterminal ( y claro, el modulo Bluetooth responde con los OK).
Ahi esta la representacion de lo que pasa en realidad y lo q tiene q pasar en el PIC.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 10:33:07
Ahora mismo estoy trabajando con la funcion de la siguiente forma:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;

do
{
LED1=1;
CaracterLeido = getch();
LED2=1;
if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{

*palabra = CaracterLeido;
*palabra++;
}

if(CaracterLeido == '\r'){
//*palabra = '\0';
*palabra++;

}

if(CaracterLeido=='\n'){
//*palabra='\0';
*palabra++;
cont++;

}

if(indice==1)
LED3=1;


indice++;
time_delay(999999999999);


}
//while (CaracterLeido != '\n'); //\n
while(cont!=2);


}

Me sale indice=1 con lo que el bucle solo lo hace 1 vez..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 19 de Enero de 2011, 11:06:53
  No será todo un problema de velocidades. ¿A cuánto tenés configurado el terminal y a cuanto el PIC?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 11:10:46
Los dos a 9600. Ya hice una prueba de connexion modulo Bluetooth con el terminal. Es mas lo que antes te he mostrado esta hecho a 9600.

La funcion getch.. como sabe que ya ha leido un caracter y tiene que ir al siguiente?
La tengo asi:

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


do
{
CaracterLeido = getch();

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

if(CaracterLeido == '\r'){
//*palabra = '\0';
*palabra++;

}

if(CaracterLeido=='\n'){
//*palabra='\0';
*palabra++;
cont++;
}

}
//while (CaracterLeido != '\n'); //\n
while(cont!=2);

}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 11:22:15
A ver es que seguro que es una tonteria.. hay que tener en cuenta que: 0d es \r y 0a es \n
Hay que leer 7 caracteres : 0d 0a 4f 4b 0d 0a 0a
 
Primero de todo entra y no entra en el if porque es \r. En este caso hay q saber si dejar ese sitio como \0(nulo) o no. En el siguiente caso pasa lo mismo para \n. Con O y K entra en el if y despues vuelve a no entrar para \r \n \n.

Al final hay un cont que detecta dos \n..

Yo lo que no veo muy claro es la actualizacion del caracter. Una vez haya hecho la "O" por ejemplo, como va a la "K"?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 19 de Enero de 2011, 11:41:54
A ver es que seguro que es una tonteria.. hay que tener en cuenta que: 0d es \r y 0a es \n
Hay que leer 7 caracteres : 0d 0a 4f 4b 0d 0a 0a
 
Primero de todo entra y no entra en el if porque es \r. En este caso hay q saber si dejar ese sitio como \0(nulo) o no. En el siguiente caso pasa lo mismo para \n. Con O y K entra en el if y despues vuelve a no entrar para \r \n \n.

Al final hay un cont que detecta dos \n..

Yo lo que no veo muy claro es la actualizacion del caracter. Una vez haya hecho la "O" por ejemplo, como va a la "K"?

  A ver.... la función getch() sí o sí lee un caracter. Tené en cuenta que en la implementación de dicha función hay un while a la espera que se setee RCIF (que justamente se setea cuando se llena el el registro RCREG que es donde se almacena el caracter que le llega via RS232). Entonces sólo salgo de dicha función cuando haya leído un caracter del RS232

  En la implementación que yo te había subido de "leer_palabra" sólo se iban almacenando en la variable los datos de entrada si no eran ni '\r' ni '\n'.

  Como va a cada caracter es sencillo. Supongamos que yo te voy dando -en la mano- pelotitas de distintos colores. A vos te interesan las rojas (que sería lo que hacemos con los if) el resto las dejas en el suelo y sólo las rojas las guardas en un vaso.

  Es así como se maneja la función con los caracteres.
  Si yo mando un '\r' o un '\n' no hago nada, pero si mando otro tipo de caracter lo voy almacenando en una variable en el mismo orden que me van llegando. Así, si el dispositivo manda \r \n O K \r \n, las \r y las \n las dejo pasar y almaceno OK en la variable.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 11:45:21
Hay una pequeña contradiccion si me permites decirlo asi.
En lo que antes he mostrado, he pensado que la respuesta es 0d0a4f4b0d0a0a

Este ultimo en negrita segun el manual no tiene que estar... seguro que ese caracter se añade pero no forma parte del OK digamos.

Ayuda por favor.. ya no se por donde ir..
Que harias?

P.D: Acabo de ver tu mensaje y si que tienes razon pero ahora mismo no se que hacer y ya se me pasa por la cabeza todo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 11:57:13
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;


while(indice<6)
{   
   CaracterLeido = getch();



   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      *palabra = CaracterLeido;
      *palabra++;
   }
   indice++;
   if (indice==6)
   {
      *palabra='\0';
   }
}
LED3=1;   
}

El problema claramente esta en la funcion. Ese led3 no se enciende.. es un while infinito porque dentro si que se entra.. pero PORQUE?
Estoy ya desesperado...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 12:22:15
Que puedo probar Angel? Dime tu lo que crees...

Y muchas gracias por la ayuda.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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í.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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?

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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');
}

}
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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. }
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 19 de Enero de 2011, 20:55:00
  Sí, tenés razón, eso era a raíz de los if que estaban en la implementación de putst.

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

  No sé porque, pero me parece que por ahí podría venir el error.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 19 de Enero de 2011, 20:57:11
Yo he pensado lo mismo del registro RCREG. He visto que hay que borrar el valor poniendo a 0 el bit RCIF... prueba a ver con eso que dices o con esto que te digo. Yo seguire probando por otros sitios.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 19 de Enero de 2011, 21:01:34
Yo he pensado lo mismo del registro RCREG. He visto que hay que borrar el valor poniendo a 0 el bit RCIF... prueba a ver con eso que dices o con esto que te digo. Yo seguire probando por otros sitios.

  Es que el bit RCIF sólo se borra cuando se vacía el registro RCREG.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 00:07:12
  Armé en proteus una simulación del módulo. Puse un PIC16F628 (U1) como si fuera el micro que estás queriendo programar. Y también puse un PIC16F628 (U2) como si fuese el módulo Bluetooth. De esta manera U1 envía el comando ATS y es U2 quien se encarga de dar la respuesta que debería dar el modulo.

 Este es el programa que está corriendo en U1

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

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

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

  También adjunto una captura. Como puede apreciarse en la misma, la variable "Respuesta" que está en U1 toma el valor "ERROR", ya que el comando que le mandé es "ATS" esto se ve en la variable "Comando" de U2
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 04:43:56
No entiendo nada... sigue sin salir amigo..
Tengo este codigo ahora mismo:

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

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

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



  while (1);
}

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

Cuando debugo no se si lo hago bien pero se queda en el while del getch
Animo va, que hay que sacarlo! Muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 05:10:26
En el primer getch de la funcion ( antes del segundo getch y por lo tanto antes del if) hay un bucle infinito en el while(RCIF!=1). RCIF es siempre diferente a 1
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 08:06:01
Hola! He ido a ver un profesor que domina la materia y me ha dicho que lo hacemos mal.

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

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

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

char buffer_todos_caracteres[6];

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

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

indice++;
}

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

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

}

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

Ayudame por favor


Muchas gracias.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 09:48:17
  No entiendo porque hay que leer todos los caracteres de entrada, pero bueno supongamos que haciendo eso no falle.

  Tus funciones están mal. En la implementación de "Leer_Respuesta" estás declarando una variable "char buffer_todos_caracteres[6]", pero nunca la usás. Después, en la función "SacarCaracteres" definís la variable "char buffer_caracteres_buenos[2]" y lo trabajás pero en ningún momento retornas dicho valor. Y por otro lado, sólo le das una dimensión de 2 pero si tu dispositivo te devuleve un mensaje de error que ocupe más te vas a perder varios caracteres.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 09:51:27
Primero quiero ser capaz de leer lo que viene. Estoy con la funcion "Sacar(...)" comentada. La funcion de leer crees que esta bien asi?
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int i=0;
int cont=0;

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

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

indice++;
}


Creo que no vas desencaminado cuando dices que falla el cleart_usart... a ver si encontramos que pasa. Muchas gracias por ayudarme tanto en esto, la verdad es que no se que esta pasando.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 09:54:51
Estoy debugando.. y a veces si que sale de la funcion pero a la siguiente iteracion se queda dentro.

unsigned char getch(void)
{

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

return RCREG;
}

Cuando debugo el cursor va del while a la linia de clear_usart.. y de esta al }( antes del return).
Por lo que nunca se para a hacer el CLRWGT a lo mejor porque como es una funcion interna.. ya no entra.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 10:12:13
  Sigue estando mal. Tenés declarada la variable i pero nunca la usas y por otro lado te falta poner *mensaje++ para que lo que vas leyendo se vaya almacenando sucesivamente. Asi como está implementada hasta ahora siempre vas a almacenar el caracter leído, en el mismo lugar.

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

  Algo así...

Código: C
  1. char getch()
  2. {
  3.   while (RCIF == 0)
  4.   {
  5.     if (OERR == 1)
  6.     {
  7.       if (TXEN == 1)
  8.       {
  9.         TXEN=0;
  10.         TXEN=1;
  11.       }
  12.       if (CREN == 1)
  13.       {
  14.         CREN=0;
  15.         CREN=1;
  16.       }
  17.     }
  18.  
  19.     if (FERR == 1)
  20.     {
  21.       dummy = RCREG;
  22.       if (TXEN == 1)
  23.       {
  24.         TXEN=0;
  25.         TXEN=1;
  26.       }
  27.     }
  28.     CLRWDT();
  29.   }
  30.   return RCREG;
  31. }
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 10:22:59
Osea sustituyo la otra funcion por este codigo que has puesto o como?

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

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 10:33:47
Gracias por la ayuda de nuevo.
Entonces la funcion de sacar..:
 
Código: [Seleccionar]
void SacarCaracteres (char buffer_todos_caracteres) //Sacamos los caracteres recibidos en falso
{
int i=0;
char buffer_caracteres[7];


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

else
buffer_caracteres[i]=buffer_todos_caracteres[i];

i++;


}

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

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

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 10:37:44
Estoy probando la nueva funcion getch. Ha salido y a aumentado el cont 2 veces creo pero ahora se ha metido en el while(RCIF==0) y no entra en ninguno de los if. Va saltando de while a if (del OERR) a if(del FERR) y vuelve a empezar...

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

Edito1: Me acabo de acordar que en serial_setup tengo la definicion del cleart_errors_usart.. la comento para que no afecte al desarrollo del programa?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 10:55:29
Estoy probando la nueva funcion getch. Ha salido y a aumentado el cont 2 veces creo pero ahora se ha metido en el while(RCIF==0) y no entra en ninguno de los if. Va saltando de while a if (del OERR) a if(del FERR) y vuelve a empezar...

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

  Ni yo tampoco.
  Lo único que me ocurre por pensar es que en algún momento sí se active el bit FERR y entonces entre a dicho if, allí dentro en la sentencia "dummy = RCREG" se borre justamente el registro y ya no se llene más. Pero tampoco tiene mucho sentido eso porque supuestamente el dispositivo sigue enviando caracteres.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 10:57:39
Voy a probar eso con un cont a ver cuantas veces entra y lo mirare con un LED.
Ahora te cuento.

Edito: Ahora mismo ha hecho 2 return RCEG. Pero porque cambia y a veces hace una cosa y a veces una otra? madre mia...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:04:45
He hecho lo del LED en FERR y se enciende el LED3( por tanto, cont es 0, no entra nunca)
Código: [Seleccionar]
char getch()
{
int cont=0; 
while (RCIF == 0)
  {
    if (OERR == 1)
    {
      if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

  }
  return RCREG;
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 11:15:10
  Me está volviendo loco este tema ya.  :5]
  Fijate, con el mismo sistema, si entra en el if de OERR. Ya no se que más pensar. ¿Será que por x motivo se apaga el RS232 del PIC y por ello se queda colgado? No se me ocurre nada  :x
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:24:30
Código: [Seleccionar]

char getch()
{
int cont=0;
int cont1=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    cont1++;
{
      if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

if(cont1==0)
LED2=1;
else
LED2=0;
  }
  return RCREG;
}

Se enciende el led3 y el led 2 no. Ahora si que esta entrando en FERR.... estoy alucinando... voy a seguir probando de desconectar y volverle  a dar alimentacion a ver si cada vez suceden cosas distintas
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:27:05
Y si se trata de un tema del cable?

pero es que no puede ser, ese cable ya lo use cuando probe el programa y funciono bien. En esos tiempos metia los codigos AT a mano por el terminal y era mucho mas feliz jej.

Vamos que esto tiene que salir.. despues de las 24h de los dias dias que le estoy dedicando...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 11:31:41
Código: [Seleccionar]

char getch()
{
int cont=0;
int cont1=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    cont1++;
{
      if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

if(cont1==0)
LED2=1;
else
LED2=0;
  }
  return RCREG;
}

Se enciende el led3 y el led 2 no. Ahora si que esta entrando en FERR.... estoy alucinando... voy a seguir probando de desconectar y volverle  a dar alimentacion a ver si cada vez suceden cosas distintas

  Mirá que está mal el código. En el caso de OERR dejaste "cont1++" fuera de las llaves "{".
  Por otro lado está bien que se encienda el LED3 ya que eso pasa cuando no hay FERR. Y que el LED2 no encienda tal vez se deba a que está mal ubicado el cont1++ en el OERR
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:35:30
Perdon por el despiste, lo siento.. son ya demasiadas horas delante de este codigo..

Ahora si que se enciende. Se encienden los dos leds.

Código: [Seleccionar]
char getch()
{
int cont=0;
int cont1=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    {
    cont1++; 
if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

if(cont1==0)
LED2=1;
else
LED2=0;
  }
  return RCREG;
}

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:38:18
http://www.ucontrol.com.ar/forosmf/programacion-en-asm/rx-no-activa-bandera-en-16f887/?wap2

Miremos los diagramas en el datasheet de la recepcion a ver como tiene que estar esa bandera.. no?

"geronimox:
Hola LucasBols.
Tengo entendido (en otros micros), que la bandera RCIF se pone a cero automaticamente al atender la interrupcion. Lo que te ahora el echo de tener que hacerlo a mano.
Asi que, si compruebas el estado de la bandera dentro de la rutina de interrupcion, siempre vas a leer cero.
Saludos!
"


Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 11:47:20
Miremos bien en el datasheet cuando se activa y desactiva el bit.
Por ejemplo en la pag 254 (FIGURE 20-1: AUTOMATIC BAUD RATE CALCULATION)

Y por ahi salen cosas..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 12:24:42
Ojo, habia un error aquí:
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int indice=0;
int cont=0;

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

}

La variable indice se incrementaba fuera del while.. no me habia dado cuenta. Ahora SI hace return RCREG pero se queda ahi colgado. Eso es porque el indice es mayor al que tiene  que ser. Osea, pasa de estar a RCIF=0 a RCIF=1, lee los dos caracteres y vuelve a RCIF=0
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 12:32:11
char getch()
{
int cont=0;
int cont1=0;
int cont2=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    {
       cont1++; 
   if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
         cont++;
      dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
   if(cont==0)
      LED3=1;
   else   
      LED3=0;

   if(cont1==0)
   LED2=1;
   else
   LED2=0;
  }
     cont2++;
   if(cont2==1)
   LED0=1;
   else
   LED0=0;
   return RCREG;
}

Envia un caracter.. se enciende el led0..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 12:36:37
Ojo, habia un error aquí:
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int indice=0;
int cont=0;

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

}

La variable indice se incrementaba fuera del while.. no me habia dado cuenta. Ahora SI hace return RCREG pero se queda ahi colgado. Eso es porque el indice es mayor al que tiene  que ser. Osea, pasa de estar a RCIF=0 a RCIF=1, lee los dos caracteres y vuelve a RCIF=0

  Si indice fuera mayor que el que tiene que ser, saldrías del while y por ende saldrías de la función.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 12:39:11
Con indice <1 y este programa ( lo pongo todo porque hace tiempo q no lo subo) puedo ver como buffer1 es 'A'. Supongo que esta retornando el AT...
que cosas pruebo?

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;

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


char getch();
void LeerRespuesta(char *mensaje);
void SacarCaracteres (char buffer_todos_caracteres);


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

 

void main ()
{
  //char buffer[2]; // aqui se almacena la respuesta
 
 
  //inicializar el puerto serie RS2326.
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

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


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


//Primer comando AT

ComandoRecibido1=buffer1;

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

time_delay(999999999999);
LeerRespuesta (ComandoRecibido1);


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

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

}
else{                                    // No es el comando bueno
   

error_comando=1;

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

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

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

}
}






/*
//Segundo comando AT

ComandoRecibido2=buffer2;
putst ("ATS0=1\n");
LED0=1;

leer_respuesta(ComandoRecibido2);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS0=1\n");

leer_respuesta(ComandoRecibido2);

if (strcmp(ComandoRecibido2,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Tercer comando AT

ComandoRecibido3=buffer3;
putst ("ATS512=4\n");
LED0=1;

leer_respuesta(ComandoRecibido3);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS512=4\n");

leer_respuesta(ComandoRecibido3);

if (strcmp(ComandoRecibido3,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Quarto comando AT

ComandoRecibido4=buffer4;
putst ("ATS502=1\n");
LED0=1;

leer_respuesta(ComandoRecibido4);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS502=1\n");

leer_respuesta(ComandoRecibido4);

if (strcmp(ComandoRecibido4,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


//Quinto comando AT

ComandoRecibido5=buffer5;
putst ("ATS536=1\n");
LED0=1;

leer_respuesta(ComandoRecibido5);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATS536=1\n");

leer_respuesta(ComandoRecibido5);

if (strcmp(ComandoRecibido5,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}



//Sexto comando AT

ComandoRecibido6=buffer6;
putst ("AT+BTK=1234\n");
LED0=1;

leer_respuesta(ComandoRecibido6);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT+BTK=1234\n");

leer_respuesta(ComandoRecibido6);

if (strcmp(ComandoRecibido6,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}



//Septimo comando AT

ComandoRecibido7=buffer7;
putst ("AT&W\n");
LED0=1;

leer_respuesta(ComandoRecibido7);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("AT&W\n");

leer_respuesta(ComandoRecibido7);

if (strcmp(ComandoRecibido7,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}




//Octavo comando AT

ComandoRecibido8=buffer8;
putst ("ATZ\n");
LED0=1;

leer_respuesta(ComandoRecibido8);
LED1=1;

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

}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putch ('\r');
LED0=0;
LED1=0;
LED2=0;
LED3=0;
putst ("ATZ\n");

leer_respuesta(ComandoRecibido8);

if (strcmp(ComandoRecibido8,"OK") == 0){
error_comando=0;
putst ("respuesta correcta");
putch ('\r');
LED3=1;

}
}
}


















// El otro dispositivo se quiere connectar con nosotros.

//Mensaje de aparejamiento : PAIR 0 008098E6A5F4 (19 caracteres) + 4 =23
ComandoRecibido9=buffer9;
//cgets(buffer9);
leer_palabra(buffer9,19);

if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

leer_palabra(buffer9,19);
//cgets(buffer9);
if (strcmp(ComandoRecibido9,"PAIR 0 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}




// Mensaje de llamada: RING 008098E6A5F4 (17 caracteres) +4 =21
ComandoRecibido10=buffer10; 
//cgets(buffer10);
leer_palabra(buffer10,17);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

//cgets(buffer10);
leer_palabra(buffer10,17);
if (strcmp(ComandoRecibido10,"RING 008098E6A5F4") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}


// Mensaje de connexion establecida CONNECT 008098E6A5F4,1101 A (27 caracteres) + 4
ComandoRecibido11=buffer11; 
//cgets(buffer11);
leer_palabra(buffer11,27);

if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
else{                                    // No es el comando bueno
    error_comando=1;
while(error_comando==1){
putst ("respuesta incorrecta");
putst ("\n");  //cambio de linea

leer_palabra(buffer11,27);
if (strcmp(ComandoRecibido11,"CONNECT 008098E6A5F4,1101 A") == 0){
error_comando=0;
putst ("respuesta correcta");
putst ("\n");  //cambio de linea
}
}
}

*/


while(error_comando==1){

time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();


}


}


 
/* =================================================================================
Function definitions
  ================================================================================= */
 
//*****************************************************************************
//Future_state_logic routine
//*****************************************************************************
char future_state_logic(void)
{
  char error = 0;
  switch (present_state)
  {
    case Idle_Low:
                 
                  if ((valor_sensor_temperatura < 10) || (valor_potenciometro < 200))
                  {
                    present_state = Idle_High;
                  }
                  else
                  if (getch_available() == true) //Si hay un caracter disponible recibido por el puerto serie
                  {
                    caracter_recibido = getch();
                    if (caracter_recibido == 'a')
                    {
present_state = Idle_High;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 0;
                    }
                    else
                    {
                      present_state = Idle_Low;
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                    error = 1;
                    }
                  }
                  break;
    case Idle_High:
                   if (TXIF == 0) // Buffer de transmision vacio
                   {
                     present_state = Idle_Low;
                   }
                   else
                  {
                     error = 1; // Ojo, esto antes estaba y estaba funcionando
present_state=Idle_High;
                   }
                   break;
    default:
  error = 1;
  }
  return (error);
}
 
//*****************************************************************************
//Output logic routine
//*****************************************************************************
char output_logic(void)
{
  unsigned char error = 1;
  switch (present_state)
  {
    case Idle_Low:
                    LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;

                   error = 0;
                   break;
    case Idle_High:
                   putst ("\n");  //cambio de linea
   putst ("Valor del pot: ");
                   putst (valor_pote_en_texto);
                   putst ("\n");  //cambio de linea
                   putst ("Valor del sensor: ");
                  putst (valor_sensor_en_texto);
                   putst ("\n");
                    LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
                   error = 0;
                   break;
    default:
                   error = 1;
                   

                   break;
  }
  return (error);
}
 
//*****************************************************************************
//Init operations 
//*****************************************************************************
void init_system (void)
{
  TRISA = 255;
  CS = 1;
  TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  TRISD=0;
}

 
//*****************************************************************************
//Time delay routine.   
//*****************************************************************************
void time_delay(unsigned int delay)
{
  unsigned int i;

  for (i = 0; i <= delay; i++)
  {
    NOP();
  }
}
//*****************************************************************************
// SERIAL SETUP 
//*****************************************************************************
void serial_setup(void)
{
  #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  BRGH = 1;
  BRG16 = 0;
  SPBRG = SPBRG_VALUE;
  SPEN = 1; // Enable serial port
  SYNC = 0; // Asincrono
  TXIE = 0; // Desactivar interrupciones en tx
  TXEN = 1; // Enable the transmitter
  TX9 = 0; // 8 bits transmission
  RCIE = 1; // Activar interrupciones en rx
  RX9 = 0; // 8 bits reception
  CREN = 1; //Enable reception
  #define clear_usart_errors_inline if (OERR)\
                                    {\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                      CREN = 0;\
                                      CREN = 1;\
                                    }\
                                    if (FERR)\
                                    {\
                                      dummy = RCREG;\
                                     TXEN = 0;\
                                      TXEN = 1;\
                                    }
}


//*****************************************************************************
// Enviar datos ( un caracter)
//*****************************************************************************

void putch(unsigned char c)
{
  while (!TXIF)
  {
   // clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}
//*****************************************************************************
// Enviar datos (un buffer)
//*****************************************************************************
void putst(register const char *str)
{
  while ((*str) != 0)
  {
    putch (*str);
   if (*str == 13) putch (10);
    if (*str == 10) putch (13);
    str++;
  }
}

//*****************************************************************************
//Leer datos ( un caracter)
//*****************************************************************************
 /*
unsigned char getch(void)
{

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

return RCREG;
}
*/

//*****************************************************************************
//Leer datos (un buffer)
//*****************************************************************************

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF) // TRMT1 is set when TSR is empty //
    return 0;   
  return RCREG;
}



 
//*****************************************************************************
//Comprueba si aun faltan datos o no
//*****************************************************************************
unsigned char getch_available(void)
{
  if (RCIF)
    return true;
  else
    return false;
}

//*****************************************************************************
//Errores USART
//*****************************************************************************
void clear_usart_errors(void)
{
  clear_usart_errors_inline;
}

//*****************************************************************************
//Leer entradas.
//*****************************************************************************

//*****************************************************************************
//Leer bytes recibidos del bus del modulo SPI
//*****************************************************************************
 
void setup_sensor(void)  // SPI Master mode:
{
  SSPEN = 1; //Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
  BF = 0;        //Receive not complete, SSPBUF is empty
  //SCK is the clock output (Master Mode)
  //Clock Polarity(Idle state of SCK)
  SMP = 0;      //Input data sampled at end of data output time
  CKE = 0;      //Transmit occurs on transition from Idle to active clock state
  SSPM3 = 0;
  SSPM2 = 0; //SPI Master mode, clock = FOSC/4
  SSPM1 = 0;
 SSPM0 = 0;
  CKP = 0; //Idle state for clock is a low level
  SSPIF = 0;   
}
 
void setup_adc(void)
{
  ADFM = 1;
  ADCON1 = 14; // PCFG3=1,PCFG2=1,PCFG1=1,PCFG0=0. Todas las entradas digitales
  CHS3 = 0;
  CHS2 = 0; // Seleccionamos el canal 0 (AN0) que es donde esta conectado el potenciometro
  CHS1 = 0;
  CHS0 = 0;
  //Tiempo de adquisicion
  ACQT2 = 0;
  ACQT1 = 1;  //Por tanto 2x1us =2us >= 1.65us( Tacq calculado teoricamente)
  ACQT0 = 0;
 
  ADCS2 = 1;
  ADCS1 = 0;    // valor que hace que sea superior a 0.7us( el minimo)
  ADCS0 = 0;
 
  ADON = 1; // A/D converter module is enabled
  /* Configure A/D interrupt*/
  ADIF = 0;
 
}
 
//*****************************************************************************
//Leer entradas.
//*****************************************************************************
 
//*****************************************************************************
//LEER DATOS SENSOR
//*****************************************************************************
unsigned char read_spi (void)
{
  TRISC7 = 1; // así pongo en alta impedancia el pin SDO
  SSPBUF = 16;
  while (SSPIF == 0);
  SSPIF = 0;
  return SSPBUF;
}
 
//*****************************************************************************
//LEER DATOS POTENCIOMETRO
//*****************************************************************************
unsigned int read_adc(void)
{
  //Empezar a leer
  GODONE = 1; // A/D conversion in progress
  while (GODONE == 1);
  ADIF = 0;
  return ((ADRESH << 8) + (ADRESL));
}
 
 
//*****************************************************************************
//FUNCION GETCHE ( SE USA EN LA FUNCION CGETS)
//*****************************************************************************
/*
unsigned char getche (void)
{
    while (RCIF != 1)
    {
clear_usart_errors_inline;
       CLRWDT();
    }
    return RCREG;
}
*/


void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int indice=0;
int cont=0;

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

}



/*
void SacarCaracteres (char buffer_todos_caracteres) //Sacamos los caracteres recibidos en falso
{
int i=0;
char buffer_caracteres[7];


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

else
buffer_caracteres[i]=buffer_todos_caracteres[i];

i++;


}

*/



char getch()
{
int cont=0;
int cont1=0;
int cont2=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    {
    cont1++; 
if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

if(cont1==0)
LED2=1;
else
LED2=0;
  }
  cont2++;
if(cont2==1)
LED0=1;
else
LED0=0;
return RCREG;
}




Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 12:41:52
El segundo caracter es una T!! estoy recibiendo AT!! como puede ser eso? ( eso con indice <2)

Si subo el indice a < 3 los dos primeros los lee y el tercer caracter hace que entre en el while. VAAA QUE LO TENEEEMOS!

Estoy alucinando. Lo tenia funcionando y he cambiado el OK del AT del strcmp para que entrase y si lo cambio no funciona. Esta ligado el strcmp con el getch?

EDITO OTRA VEZ: CONCLUSION: el sistema no es robusto, a veces se mete en el while y a veces no. No debe enviar lo mismo cada vez.

Ayudaaa por faaavor!
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 12:56:34
Ahora he conseguido hacerlo entrarlo en el while. POR FIN!  Eso si, recibo AT y lo he comparado con AT.
Osea, todo lo que recibo ( recuerda que no utilitzo la funcion que coge el "OK") es AT.


Código: [Seleccionar]
while(error_comando==0){

time_delay(10000000);
CS = 0;
    byte_alto = read_spi();
    byte_bajo = read_spi();
    CS = 1;
    valor_sensor_temperatura = (byte_alto << 8) + byte_bajo;
    valor_sensor_temperatura = valor_sensor_temperatura >> 7;
    valor_potenciometro = read_adc();
    valor_pote_en_texto = itoa (pote_buf, valor_potenciometro, 10);
    valor_sensor_en_texto = itoa (sensor_buf, valor_sensor_temperatura, 10);
    output_logic();
    future_state_logic();


}


}


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;

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


char getch();
void LeerRespuesta(char *mensaje);
void SacarCaracteres (char buffer_todos_caracteres);


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

 

void main ()
{
  //char buffer[2]; // aqui se almacena la respuesta
 
 
  //inicializar el puerto serie RS2326.
  valor_potenciometro = 0;
  valor_sensor_temperatura = 0;
  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 

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


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


//Primer comando AT

ComandoRecibido1=buffer1;

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

time_delay(999999999999);
LeerRespuesta (ComandoRecibido1);


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

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

}
else{                                    // No es el comando bueno
   

error_comando=1;

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

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

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

}
}

Código: [Seleccionar]
char getch()
{
int cont=0;
int cont1=0;
int cont2=0;
 
while (RCIF == 0)
  {
    if (OERR == 1)
    {
    cont1++; 
if (TXEN == 1)
      {
        TXEN=0;
        TXEN=1;
      }
      if (CREN == 1)
      {
        CREN=0;
        CREN=1;
      }
    }
 
    if (FERR == 1)
    {
      cont++;
dummy = RCREG;
      if (TXEN == 1)
      {
        TXEN=0;
       TXEN=1;
      }
    }
    CLRWDT();
 
if(cont==0)
LED3=1;
else
LED3=0;

if(cont1==0)
LED2=1;
else
LED2=0;
  }
  cont2++;
if(cont2==1)
LED0=1;
else
LED0=0;
return RCREG;
}

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 13:10:53
Creo que si a veces funciona y a veces no es debido a los retardos. Me explico

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

//time_delay(999999999999);
LeerRespuesta (ComandoRecibido1);

Con ese retardo de ahi funciona, en cambio sin el no. Fijate tu! Un reetardo!
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 13:53:56
Creo que si a veces funciona y a veces no es debido a los retardos. Me explico

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

//time_delay(999999999999);
LeerRespuesta (ComandoRecibido1);

Con ese retardo de ahi funciona, en cambio sin el no. Fijate tu! Un reetardo!

  ¿Será que sin el retardo no le da tiempo al módulo a recoger los datos?
  Es un poco raro. Porque si yo mando datos y me pongo a leer inmediatamente (me quedo esperando por el propio while que hay dentro de la función getch) y recién cuando el módulo reciba los datos y pueda responder lo va a hacer y entonces voy a terminar leyendo bien.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 13:57:42
Sospecho que esta el echo activado y que recibo lo que envio.

He visto que recibia AT ( que es lo que envio, bueno, lo que envio es AT\n). He imaginado que estaba habilitado el echo y he visto en la guia dl modulo de comandos AT que el comando ATEn (n=0 para disable y n=1 para enable) estaba por default a 1. Estoy intentando cambiarlo y n funciona...
Ahora recibo caracteres raros en el buffer...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 14:12:40
Puedes ayudarme con esta funcion?
Código: [Seleccionar]
/*
void SacarCaracteres (char buffer_todos_caracteres) //Sacamos los caracteres recibidos en falso
{
int i=0;
char buffer_caracteres[7];


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

else
buffer_caracteres[i]=buffer_todos_caracteres[i];

i++;


}

*/


Mientras yo pruebo bien lo otro. Muchas gracias amigo
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 14:19:37
  No sé que quieres que intente hacer con dicha función.

  ¿El parámetro que le pasas es todo lo que lees con la función de lectura?
  Con definir la variable "buffer_caracteres[7]" como global y no dentro de la función ya bastaría.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 14:27:17
Salen errores... "pointer required" en casi todas las partes del codigo y no devuelvo nada ( no se como hacerlo).
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 14:32:44
Depende de lo que envio por el putst entra en el bucle infinito del while...(de la funcion getch)

Creo que seria bueno volver a cambiar la funcion de leer. La condicion de indice < 4 no me gusta mucho... alguna idea?
Código: [Seleccionar]
void LeerRespuesta(char *mensaje) // Recibimos \n \r O K \n \r por lo tanto 6 caracteres.
{
int indice=0;
int cont=0;

time_delay(99);
while(indice<4){
*mensaje=getch();
*mensaje++;
indice++;
}

}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 14:46:14
Te cuento las cosas que estoy haciendo.

Cuando tengo el echo activado, me devuelve el caracter leido ( pero solo si el char tiene 2 o menos caracteres, no se porque..)
Si tengo el echo desactivado, me devuelve unos caracteres raros en forma de quadrado...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 14:57:32
Estoy controlando el registro RCREG y pone 0x41 ( que coincide con la A) y 0x54 que coincide con la T. Porque recibo AT? ese es el problema..

Acabo de ejecutar y he visto que en el RCREG hay 0x0A y en el buffer no lo coge.. sale un caracter extraño. AHI SI QUE ESTA EL PROBLEMA! que puedo hacer?
Osea ahora mismo estoy viendo el caracter 0x0d y despues viene el 0x0a. Cuando coge estos dos para. No los guarda bien en el buffer.. no se si me explico cuando digo que los guarda como un quadrado..

dime algo si no lo entiendes. Ya sabes por donde puede ir el problema? tiene que haber otra forma de guardar los datos...

Y si lo hacemos por punteros? Comprobamos que tal direccion sea 0x0d etc..

RESUMEN DE LA SITUACION: estoy enviando ATE0 y ahora estoy viendo el registro RCREG. La primera vez veo que vale 0x0d ( el retorno de carro) pero cuando lo quiere meter en el buffer sale ese caracter raro. Lo mismo pasa en el segundo con 0x0a. Una vez hay esos dos caracteres salta al while y ya no sale.
Ayudame por favor.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 15:38:19
Estoy controlando el registro RCREG y pone 0x41 ( que coincide con la A) y 0x54 que coincide con la T. Porque recibo AT? ese es el problema..

Acabo de ejecutar y he visto que en el RCREG hay 0x0A y en el buffer no lo coge.. sale un caracter extraño. AHI SI QUE ESTA EL PROBLEMA! que puedo hacer?
Osea ahora mismo estoy viendo el caracter 0x0d y despues viene el 0x0a. Cuando coge estos dos para. No los guarda bien en el buffer.. no se si me explico cuando digo que los guarda como un quadrado..

dime algo si no lo entiendes. Ya sabes por donde puede ir el problema? tiene que haber otra forma de guardar los datos...

Y si lo hacemos por punteros? Comprobamos que tal direccion sea 0x0d etc..

RESUMEN DE LA SITUACION: estoy enviando ATE0 y ahora estoy viendo el registro RCREG. La primera vez veo que vale 0x0d ( el retorno de carro) pero cuando lo quiere meter en el buffer sale ese caracter raro. Lo mismo pasa en el segundo con 0x0a. Una vez hay esos dos caracteres salta al while y ya no sale.
Ayudame por favor.

  El tema puede ser que vos veas esos caracteres "raros" porque estás viendo el dato en modo ASCII, miralo en modo decimal o hexa para asegurarte bien.
  Yo no puedo hacer mucho ya que no tengo el módulo como para ir probando cosas. Lo que acabo de hacer es armar en físico el circuito que usé en proteus simulando el módulo con los dos PIC16F628 y me funcionó de maravillas.  Primero envíe AT para que responda OK y luego ATS para que responda ERROR y funcionó bien ya que puse un led en U1 (que sería tu micro) y se prendió cuando la respuesta fue OK y se apagó cuando fue ERROR.

  Y la función que usé para lectura de la respuesta fue la misma que te plantee en su momento.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 17:18:56
Ya he probado de verlo en hexa y se guarda bien. Lo que falla es que cuando ha cogido los dos caracteres entra en el bucle del whilee... No puede ser que esos caracteres hagan que el bit se ponga a 0 o algo?

Ya se que puedes hacer poco sin el modulo y de veras te agradezco mucho lo que estas haciendo.
Solo dime las pruebas que quieres que haga o lo que se te ocurra.

Muchas gracias
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 19:03:58
Estoy viendo que hay que poner las veces exactas que tiene que hacer el getchar porque ahora he puesto 50 por ejemplo y entra en el getch y se queda alli...
Alguna idea amigo para probar?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 21:13:54
He estado mirando y se produce la interrupcion de RCIF( puesta a 1) cuando el bit ABDEN pasa de 0 a 1.
Angel dime tu las pruebas que haria porque a mi ya no me queda ninguna...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 20 de Enero de 2011, 21:31:23
Fijate:
Código: [Seleccionar]
ABDEN: Auto-Baud Detect Enable bit
Asynchronous mode:
1 = Enable baud rate measurement on the next character. Requires reception of a Sync field (55h);
cleared in hardware upon completion.
0 = Baud rate measurement disabled or completed

Puede que este relacionado con la velocidad no? no se eh ya casi digo por decir algo..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 22:15:47
Fijate:
Código: [Seleccionar]
ABDEN: Auto-Baud Detect Enable bit
Asynchronous mode:
1 = Enable baud rate measurement on the next character. Requires reception of a Sync field (55h);
cleared in hardware upon completion.
0 = Baud rate measurement disabled or completed

Puede que este relacionado con la velocidad no? no se eh ya casi digo por decir algo..

  Sí, estaba viendo justo eso. No contesté antes porque fui a cenar.
  No entiendo porque se pone por si solo en 1. En teoría después de un PowerOnReset está en 0, y cuando vos inicializas el UART en ningún momento lo hacés 1.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 20 de Enero de 2011, 23:06:12
  Encontré esto en el datasheet del PIC18F4550 "The Enhanced USART module supports the automatic detection and calibration of baud rate. This feature is active only in Asynchronous mode and while the WUE bit is clear."
  Y casualmente el bit WUE permanece en 0 después de PowerOnReset.

  Posiblemente pase que tu PIC se quede esperando un caracter en particular (que es 0x55) que se usa para el autocalibrado de la velocidad, al no recibir dicho caracter no logra establecer bien la velocidad y se cuelga todo.

  Supongo que a mi no me pasa lo mismo con los 16F628 porque no tiene el autocalibrado.

  Fijate en tu función de inicialización de UART de dejar en 1 el bit WUE, como para que no intente hacer la detección automática de la velocidad.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 05:08:40
Esto de la cabecera 0x55 no es con el bit abden?

WUE: Wake-up Enable bit
Asynchronous mode:
1 = EUSART will continue to sample the RX pin – interrupt generated on falling edge; bit cleared in
hardware on following rising edge
0 = RX pin not monitored or rising edge detected
Synchronous mode:
Unused in this mode.


ABDEN: Auto-Baud Detect Enable bit
Asynchronous mode:
1 = Enable baud rate measurement on the next character. Requires reception of a Sync field (55h);
cleared in hardware upon completion.
0 = Baud rate measurement disabled or completed
Synchronous mode:
Unused in this mode.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 05:46:59
He probado de activar los dos bits y nada.. sigue sin funcionar..

He repasado que el setup de la funcion y creo que esta bien:
Código: [Seleccionar]
To set up an Asynchronous Reception:
1. Initialize the SPBRGH:SPBRG registers for the
appropriate baud rate. Set or clear the BRGH
and BRG16 bits, as required, to achieve the
desired baud rate.
2. Enable the asynchronous serial port by clearing
bit, SYNC, and setting bit, SPEN.
3. If the signal at the RX pin is to be inverted, set
the RXDTP bit.
4. If interrupts are desired, set enable bit, RCIE.
5. If 9-bit reception is desired, set bit, RX9.
6. Enable the reception by setting bit, CREN.
7. Flag bit, RCIF, will be set when reception is
complete and an interrupt will be generated if
enable bit, RCIE, was set.
8. Read the RCSTA register to get the 9th bit (if
enabled) and determine if any error occurred
during reception.
9. Read the 8-bit received data by reading the
RCREG register.
10. If any error occurred, clear the error by clearing
enable bit, CREN.
11. If using interrupts, ensure that the GIE and PEIE
bits in the INTCON register (INTCON<7:6>) are
set.

He mirado tambien el registro que controla la velocidad SPBRG y SPBRGH. El primero tiene un valor de "00000000" mientras que el segundo "00011111"
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 07:11:48
He pensado en hacer la siguiente prueba. Que el ordenador haga del modulo y enviarle al PIC los \r\nOK\r\n de esta forma. Que te parece? eso tu tambien podrias probarlo no? se puede debugar con todo esto y ver que pasa.

1.Cuando envio un OK desde el terminal hacia el PIC el registro RCREG sigue a 0.. no recibe este caracter..

2. Me he fijado en el terminal.. cuando envio \n como string equivale a 5c 6e en cambio cuando envio 0d como hex el string es \n. ( con el punto).
Puede ser una pista esto?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 08:01:28
He visto que del registro BAUDCON  cambia el bit 6 de 1 a 0 ( cuando debugo y envio datos). Si no envio datos se queda a 1.

RCIDL: Receive Operation Idle Status bit
1 = Receive operation is Idle
0 = Receive operation is active

Por lo tanto esta detectando que estamos recibiendo algo o almenos se activa..

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 08:08:15
Como veis voy comentado las cosas que voy haciendo para que sepais en el punto exacto en el que estoy. De esta forma creo que resulta mas facil todo.
Ahora mismo estoy mirando registros y he visto esto:

SPEN: Serial Port Enable bit
1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
0 = Serial port disabled (held in Reset)

RX y TX si que lo configuramos pero DT Y CK no... Puede ser esto? Cuando abro el terminal y tengo conectado el modulo sale una configuracion distinta  que cuando lo abro con el PIC conectado.

Con el modulo Bluetooth:

RTS,CTS,DTR,DSR,RING EN VERDE ( ACTIVOS) y el resto en rojo(inactivos)--> que son DCD y Break


Con el PIC:
RTS,CTS,DTR EN VERDE(ACTIVOS) y el resto inactivos
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 21 de Enero de 2011, 09:57:09

SPEN: Serial Port Enable bit
1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
0 = Serial port disabled (held in Reset)

RX y TX si que lo configuramos pero DT Y CK no... Puede ser esto? Cuando abro el terminal y tengo conectado el modulo sale una configuracion distinta  que cuando lo abro con el PIC conectado.



  DT y CK son los mismos pines que RX y TX respectivamente. Sólo que en modo asincrónico se los denomina RX y TX (Receiver y Transmiter) y en modo sincrónico son DT y CK (Data y Clock)
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 10:02:07
Ok, mirate los otros post.. a ver si sacamos algo claro de que puede pasar por favor
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 11:02:08
Hola Angel, he mirado de utilitzar una funcion que habia en un programa de muestra en la web de microchipc
Es este:

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF)    // TRMT1 is set when TSR is empty //
    return 0;  
  return RCREG;
}

El problema es que solo lee dos caracteres. Estoy habilitando el echo para que devuelva lo que envio (el comando AT, en este caso he puesto "hola") y lee bien ho pero despues ya no. Puede ser que almacene los datos de forma que solo cabe eso? me explico, nosotros estamos guardando 6 espacios suponiendo que cada caracter es un espacio pero a lo mejor no lo guarda de este modo.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 11:16:13
No sera que puedo leer solo dos datos porque vienen los datos en hexadecimal y como tengo 1byte solo puedo guardar dos datos?

Tengo problemas tambien con la funcion putch. Solo envia los dos primeros caracteres... luego tambien se queda en el bucle:

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}

El bit txif es el mismo bit que rcif pero para la transmision... algo pasa y esta por ahi...

El CLRWDT si no lo tengo en los fuses no tendria que quitarlo?
Ayudame por favor
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 21 de Enero de 2011, 12:31:02
  Después de unos pequeños problemas con el compilador, pude hacerlo funcionar nuevamente.
  Programe un PIC18F4550, simulando tu micro y un 16F628 simulando el módulo bluetooth (como lo había hecho antes con los 2 628).

  Puse este código en el 4550..

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.  
  90. void LeerRespuesta(char * mensaje)
  91. {
  92.   char CaracterLeido;
  93.  
  94.   getch();
  95.   getch();
  96.   do
  97.   {
  98.     CaracterLeido = getch();
  99.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  100.     {
  101.       *mensaje = CaracterLeido;
  102.       mensaje++;
  103.     }
  104.     *mensaje = '\0';
  105.   }
  106.   while (CaracterLeido != '\n');
  107.  
  108. }
  109.  
  110. */
  111.  
  112.  
  113. void init_system (void)
  114. {
  115.   TRISA = 255;
  116.   //CS = 1;
  117.   TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  118.   TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  119. }
  120.  
  121.  
  122. void main (void)
  123. {
  124.   char * RespuestaRecibida;
  125.   char Respuesta[10];
  126.  
  127.   init_system();
  128.   serial_setup();
  129.  
  130.   putst ("AT");
  131.   putch ('\r');
  132.  
  133.  
  134.   Respuesta[0] = getch();
  135.   Respuesta[1] = getch();
  136.   Respuesta[2] = getch();
  137.   Respuesta[3] = getch();
  138.   Respuesta[4] = getch();
  139.   Respuesta[5] = getch();
  140.  
  141.   while (1);
  142. }

  Fijate que todavía no hago uso de la función "LeerRespuesta", sino que hice sucesivos getch(). Así como está me funcionó bien (te adjunto una captura del valor que toma la variable respuesta)

  Tal parece que el problema está en como estaba declarada dicha variable, ya que antes lo había hecho con dicha variable declarada globalmente y no funcionaba, y ahora que la declaré dentro del main sí me funciona.

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 12:57:24
bieen!! muchisimas gracias!
Ya parece que empieza a tomar forma..
Estoy recibiendo
0x0d
0x0a
0x4f
0x4b
0x0d
0x0a

Hasta aqui lo que tengo que recibir y despues recibo esto hasta llenar el buffer

0xac
0xf8
0x14
0x04

Casi casiii esta!
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 13:01:23
He declarado Respua[6] en vez de Respuesta[10] para que lo coja bien. Ahora toca hacer la funcion que guarde el OK.
Que te parece asi..

Código: [Seleccionar]
void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 
char * RespuestaRecibida;
char Respuesta[6];
char ok[2];
int i=0;

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


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

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

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

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

ComandoRecibido=ok;

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

}

El codigo no me dicen que tenga que estar super estructurado.. yo no haria una funcion especifica y tal.. lo haria asi. Te parece que esta OK?

Muchas gracias eh..ya veo un poco de luz al final del tunel ahora...
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 13:40:57
Hola amigo.
Para no tener que enviar el caracter ATE0 y que desactive el echo ( que en el primer caso cuando envio el ate0 no funciona) he decidico almacenar el echo y el OK de manera que cuando envio AT recibo:

 41(A) 54(T) 0D 0D 0A 4f(O) 4b(K) OD OA.

He probado eso y lo lee bien todo. He hecho codigo para separar el OK y poderlo comparar en el strcmp. Hasta aqui bien pero cuando llega al strcmp no entra al correcto. Dejo el codigo:

Código: [Seleccionar]
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];
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++;
}
//while(1);

ComandoRecibido1=ok;

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

}
else{                                    // No es el comando bueno
while(1);
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 21 de Enero de 2011, 13:55:57
  Puede ser que te esté pasando algo similar a lo que me pasaba a mí, porque si no me equivoco tenés definido ComandoRecibido1 globalmente, probá definirlo dentro del main
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 14:35:14
He probado de declararlo como
register const char  * ComandoRecibido1;

Y no entra..
Alguna idea?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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....
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 18:12:32
Braaaavo! era eso. Voy a seguir con los otros comandos. Muchas gracias

Despues te comento
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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;


}
}

Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 21 de Enero de 2011, 18:57:23
Entonces como lo hago? indicame que pongo exactamente..
Lo raro es que funcionaba antes..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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;


}
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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 :)
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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?
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris 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.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 11:42:23
Pero entonces no puedo tener todos los buffers declarados y se van a colar caracteres como me pasaba ayer..
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 12:03:12
  Para evitar lo de los caracteres "raros" se puede recurrir a algo así....

Código: C
  1. char buffer[30];
  2. char ok[3];
  3. char indice;
  4.  
  5. /*******************************************
  6. * Primer respuesta
  7. * supongamos que se tengan que leer 10 caracteres
  8. ********************************************/
  9.  
  10. buffer[0] = getch();
  11. ......
  12. ......
  13. buffer[9] = getch();
  14. buffer[10] = '\0'; //pongo el caracter nulo para indicar fin de cadena
  15.  
  16. //eso para llenar el buffer
  17.  
  18. //ahora la conversión para la variable ok
  19.  
  20. indice = 0;
  21. while (buffer[indice] != '\0') //mientras no sea el caracter nulo, o sea mientras esté dentro de la cadena
  22. {
  23.   if ((buffer[indice] == 'O') && (buffer[indice + 1] == 'K') // evaluo así para asegurarme que la O y la K estén seguidas
  24.   {
  25.     ok[0] = O;
  26.     ok[1] = K;
  27.   }
  28.   indice++;
  29. }
  30. ok[2] = '\0';
  31.  
  32. // después vendría el uso de strcmp y todo lo que esté asociado con él.
  33.  
  34.  
  35. /*******************************************
  36. * Primer respuesta
  37. * supongamos que se tengan que leer 7 caracteres
  38. ********************************************/
  39.  
  40. buffer[0] = getch();
  41. ......
  42. ......
  43. buffer[6] = getch();
  44. buffer[7] = '\0'; //pongo el caracter nulo para indicar fin de cadena
  45.  
  46. //eso para llenar el buffer
  47.  
  48. //ahora la conversión para la variable ok
  49.  
  50. indice = 0;
  51. while (buffer[indice] != '\0') //mientras no sea el caracter nulo, o sea mientras esté dentro de la cadena
  52. {
  53.   if ((buffer[indice] == 'O') && (buffer[indice + 1] == 'K') // evaluo así para asegurarme que la O y la K estén seguidas
  54.   {
  55.     ok[0] = O;
  56.     ok[1] = K;
  57.   }
  58.   indice++;
  59. }
  60. ok[2] = '\0';
  61.  
  62. // y así se repite constantemente....
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 12:06:50
Perdona por la insistencia pero lo que no entiendo es como se puede escribir encima de un buffer..
El proceso se hara correctamente? si uno es mas largo que otro siempre quedaran restos

Código: [Seleccionar]
//*****************************************************************************
//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;

}

En el caso que por ejemplo el primer comando tenga 15 caracteres y el segundo tenga 12 hara que queden esos 3 alli con el valor anterior..



Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 12:17:21
  Es que en C una cadena termina con el caracter nulo '\0'.
  Si yo tengo algo así....

Código: C
  1. buffer[0] = 'A';
  2. buffer[1] = 'T';
  3. buffer[2] = 'S';
  4. buffer[3] = '\0';
  5. buffer[4] = 'N';
  6. buffer[5] = 'a';
  7. buffer[6] = 'd';
  8. buffer[7] = 'a';

  en teoría la palabra que yo voy a leer será ATS porque después viene el caracter nunlo. Y sino se recurre a algo así y listo......

Código: C
  1. buffer[0] = 'A';
  2. buffer[1] = 'T';
  3. buffer[2] = 'S';
  4. buffer[3] = '\0';
  5. ....
  6. ....
  7. bufer[n] = '\0'; // y llegas hasta el final de buffer completando con el caracter nulo para que no aparezca nada raro
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 12:18:45
Voy a probar entonces! Ya te voy contando!

Por cierto antes declaraste indice como char.. fue un error no?

Edito: Tambien declaro un unico puntero no?

register const char  *ComandoRecibido;
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 12:25:00
Voy a probar entonces! Ya te voy contando!

Por cierto antes declaraste indice como char.. fue un error no?

  No, una declaración de variable char implica que va a ocupar 1 byte. No necesariamente es que se vaya a utilizar para un caracter.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 12:34:29
No me funciona ahora. Te dejo como lo tengo:
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



/* =================================================================================
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 indice;
register const char *ComandoIdeal = "OK";

char Respuesta[30];
char ok[3]; // ES FIJO!!
register const char  *ComandoRecibido;

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



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

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();
Respuesta[9]='\0';

indice=0;

indice = 0;
while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
}
ok[2] = '\0';



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

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

Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 12:36:50
Ya funciona todo otra vez ( lo de los comandos AT) y con mucha menos memoria, si señor! hago la implementacion para leer los mensajes y no se queja del compilador.

Te queria comentar que habria que hacer un while.. porque claro los comandos se envian, el dispositivo se configura para poder ser encontrado y para poder ser connectable con los otros pero eso no te garantiza que sea al instante. Tiene que estar un rato en estado de "idle" monitorizando si le llega eso o no. Creo que una vez que viene el primer mensaje ya vienen los otros dos seguidos. Osea solo habria que hacer esto para el primero.

Te dejo el codigo aqui. Hay que hacer la funcion que lea exactamente el caracter, se te ocurre algo para no tener que hacer lo del ok[0]=='O'.. en este caso son muchos caracteres.. demasiados!

Si no hay mas remedio pues se hara pero yo pregunto a ver..

Código: [Seleccionar]
//***********************************************************//
//ESPERAR A QUE UN DISPOSITIVO SE QUIERA CONNECTAR AL NUESTRO//
//***********************************************************//     


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


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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]= getch();
Respuesta[16]= getch();
Respuesta[17]= getch();
Respuesta[18]= getch();
Respuesta[19]= getch();
Respuesta[20]= getch();
Respuesta[21]= getch();
Respuesta[22]= getch();
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);


// RETOCAR ESTA FUNCION
while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    aparejamiento[0] = Respuesta[indice];
    aparejamiento[1] = Respuesta[indice + 1];
  }
  indice++;
  aparejamiento[2] = '\0';
}


//while(1);

ComandoRecibido=aparejamiento;
if (strcmp(ComandoRecibido,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

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






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


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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]= getch();
Respuesta[16]= getch();
Respuesta[17]= getch();
Respuesta[18]= getch();
Respuesta[19]= getch();
Respuesta[20]= getch();
Respuesta[21]= '\0';
Respuesta[22]= '\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);


// RETOCAR ESTA FUNCION
while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ring[0] = Respuesta[indice];
    ring[1] = Respuesta[indice + 1];
  }
  indice++;
 ring[2] = '\0';
}


//while(1);

ComandoRecibido=ring;
if (strcmp(ComandoRecibido,"RING 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

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




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

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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]= getch();
Respuesta[16]= getch();
Respuesta[17]= getch();
Respuesta[18]= getch();
Respuesta[19]= getch();
Respuesta[20]= getch();
Respuesta[21]= getch();
Respuesta[22]= getch();
Respuesta[23]= getch();
Respuesta[24]= getch();
Respuesta[25]= getch();
Respuesta[26]= getch();
Respuesta[27]= getch();
Respuesta[28]= getch();
Respuesta[29]= getch();
Respuesta[30]= getch();
Respuesta[31]= '\0';

indice = 0;

//while(1);


// RETOCAR ESTA FUNCION
while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    connexion[0] = Respuesta[indice];
    connexion[1] = Respuesta[indice + 1];
  }
  indice++;
 connexion[2] = '\0';
}


//while(1);

ComandoRecibido=connexion;
if (strcmp(ComandoRecibido,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

}
else{                                    // No es el comando bueno
// while(1);
error_comando=1;
}
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 14:16:32
  Qué curioso!!! que lo hayas tenido que implementar así

Código: C
  1. Respuesta[0] = getch();
  2. Respuesta[1] = getch();
  3. Respuesta[2] = getch();
  4. Respuesta[3] = getch();
  5. Respuesta[4] = getch();
  6. Respuesta[5] = getch();
  7. Respuesta[6] = getch();
  8. Respuesta[7] = getch();
  9. Respuesta[8] = getch();
  10. Respuesta[9]=  getch();
  11. Respuesta[10]= getch();
  12. Respuesta[11]= getch();
  13. Respuesta[12]= getch();
  14. Respuesta[13]= getch();
  15. Respuesta[14]= getch();
  16. Respuesta[15]= getch();
  17. Respuesta[16]= getch();
  18. Respuesta[17]= getch();
  19. Respuesta[18]= getch();
  20. Respuesta[19]= getch();
  21. Respuesta[20]= getch();
  22. Respuesta[21]= getch();
  23. Respuesta[22]= getch();
  24. Respuesta[23]='\0';
  25. Respuesta[24]='\0';
  26. Respuesta[25]='\0';
  27. Respuesta[26]='\0';
  28. Respuesta[27]='\0';
  29. Respuesta[28]='\0';
  30. Respuesta[29]='\0';
  31. Respuesta[30]='\0';
  32. Respuesta[31]= '\0';

  Yo lo implementé de la otra forma, es decir, sin llenar todo el resto de la variable con el caracter nulo. Y me funcionó bien en la simulación.  Te adjunto 3 capturas que se corresponden con el valor que toma la variable Respuesta, justamente a tres respuestas distintas, y en todos los casos la variable ok toma el valor adecuado y la comparación con strcmp también funciona bien.
  En el primer caso sí está lleno de caracteres nulos porque es la primer respuesta. En el segundo también porque la segunda respuesta es más larga que la primera. En el tercer caso la respuesta es más corta que la segunda y puede apreciarse como aparece un caracter nulo en el medio de la cadena.


Ya funciona todo otra vez ( lo de los comandos AT) y con mucha menos memoria, si señor! hago la implementacion para leer los mensajes y no se queja del compilador.

Te queria comentar que habria que hacer un while.. porque claro los comandos se envian, el dispositivo se configura para poder ser encontrado y para poder ser connectable con los otros pero eso no te garantiza que sea al instante. Tiene que estar un rato en estado de "idle" monitorizando si le llega eso o no. Creo que una vez que viene el primer mensaje ya vienen los otros dos seguidos. Osea solo habria que hacer esto para el primero.

Te dejo el codigo aqui. Hay que hacer la funcion que lea exactamente el caracter, se te ocurre algo para no tener que hacer lo del ok[0]=='O'.. en este caso son muchos caracteres.. demasiados!

Si no hay mas remedio pues se hara pero yo pregunto a ver..

Código: [Seleccionar]
//***********************************************************//
//ESPERAR A QUE UN DISPOSITIVO SE QUIERA CONNECTAR AL NUESTRO//
//***********************************************************//     


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

.........

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


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


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



  Todos esos mensajes ¿Cómo te los envía el módulo? ¿Con la forma \r\n mensaje \r\n? (entendiendo por mensaje a toda la cadena que vos pones en cada una de las partes) De ser así, insisto en que pruebes con mi función de LeerRespuesta ya que está hecha para que discrimine los \r\n iniciales y los \r\n finales.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 14:26:06
Lo de poner hasta el numero 31 de espacios vacios lo dejare asi porque no me molesta y lo probe de tu manera y no me funciono. Total, funciona bien.

Si, el mensaje tiene la misma estructura que antes. El datasheet pone que todas las respuestas del modulo empiezan y acaban con \n. Respecto a leer cada caracter, harias la misma estructura que antes?

que vaya corriendo y ir cogiendo por los caracteres? o un if de esta forma:
if((buffer='P')&& buffer[i+1]=='A') etc etc.. hasta completar el mensaje.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 14:51:47
Lo de poner hasta el numero 31 de espacios vacios lo dejare asi porque no me molesta y lo probe de tu manera y no me funciono. Total, funciona bien.

Si, el mensaje tiene la misma estructura que antes. El datasheet pone que todas las respuestas del modulo empiezan y acaban con \n. Respecto a leer cada caracter, harias la misma estructura que antes?

que vaya corriendo y ir cogiendo por los caracteres? o un if de esta forma:
if((buffer='P')&& buffer[i+1]=='A') etc etc.. hasta completar el mensaje.

  No, usaría mi función LeerRespuesta.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 16:59:31
  Esta es la función LeerRespuesta

Código: C
  1. char * LeerRespuesta(char * mensaje)
  2. {
  3.   char CaracterLeido;
  4.   char * Mensaje;
  5.  
  6.   Mensaje = mensaje;
  7.   do
  8.   {
  9.     CaracterLeido = getch();
  10.   }
  11.   while (CaracterLeido != '\n');
  12.  
  13.   do
  14.   {
  15.     CaracterLeido = getch();
  16.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  17.     {
  18.       *Mensaje = CaracterLeido;
  19.       Mensaje++;
  20.     }
  21.     *Mensaje = '\0';
  22.   }
  23.   while (CaracterLeido != '\n');
  24.   return mensaje;
  25. }

  El primer do-while se ocupa de obviar todo lo que esté antes del prime '\n', y el segundo do-while se ocupa de almacenar todo lo que vaya llegando, siempre y cuando sea distinto de '\r' o '\n'. Y se termina cuando llega '\n'.

  Este es el programa en el que lo uso...

Código: C
  1. void main (void)
  2. {
  3.  
  4.   char Respuesta[30];
  5.   char ok[3];
  6.   char indice;
  7.  
  8.   init_system();
  9.   serial_setup();
  10.   PORTB = 0;
  11.   putst ("AT");
  12.   putch ('\r');
  13.   LeerRespuesta(Respuesta);
  14.   if (strcmp (Respuesta, "OK") == 0) RB6 = 1;
  15.  
  16.   while (RA4 == 1); //esto esta puesto simplemente para poder pausear y ver el valor de Respuesta
  17.  
  18.   putst ("ATS");
  19.   putch ('\r');
  20.  
  21.   LeerRespuesta(Respuesta);
  22.   if (strcmp (Respuesta, "OK") == 0) RB7 = 1;
  23.  
  24.   while (RA4 == 0); //esto esta puesto simplemente para poder pausear y ver el valor de Respuesta
  25.   while (RA4 == 1);
  26.  
  27.   putst ("AT");
  28.   putch ('\r');
  29.   LeerRespuesta(Respuesta);
  30.   if (strcmp (Respuesta, "OK") == 0) RB6 = 0;
  31.  
  32.   while (1);
  33. }

  Como verás mando 3 comandos AT. Con otro pic le envío supuestas respuestas para que este programa las leea. Las respuestas que envío son: 1) \r\nOK\r\n 2) ATS\r\r\nCONECT PAIR BUENO\r\n 3) \r\nOK\r\n
  En la respuesta 2 envió ATS\r antes de todo lo otro, simulando también como si estuviera el echo activado.
  Dejo 3 capturas en las que se ve el valor que va tomando la variable Respuesta en los distintos casos.

  Como verás el programa también tiene strcmp y siempre da bien. En el primer caso se hace 1 RB6. En el segundo caso no se hace 1 RB7 ya que, obviamente, lo que llega no es OK. En el tercer caso se hace 0 RB6 porque lo que llega si es OK.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 19:04:44
Muchas gracias por estos ejemplos. Ya lo he preparado todo para cuando mañana lo pruebe en el lab.

De esta manera el programa se quedara esperando a los tres mensajes o hay que poner algun while para que este por alli y vaya mirandolo todo? Crees que de esta forma funcionara?

Adjunto el codigo entero de esta parte de comandos AT que es como lo tengo actualmente:

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



/* =================================================================================
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 indice;
register const char *ComandoIdeal = "OK";

char Respuesta[32];
char ok[3]; // ES FIJO!!
char aparejamiento[23];
char ring[21];
char connexion[31];

register const char  *ComandoRecibido;
int i=9;

 
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();
Respuesta[9]='\0';
Respuesta[10]='\0';
Respuesta[11]='\0';
Respuesta[12]='\0';
Respuesta[13]='\0';
Respuesta[14]='\0';
Respuesta[15]='\0';
Respuesta[16]='\0';
Respuesta[17]='\0';
Respuesta[18]='\0';
Respuesta[19]='\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

ComandoRecibido=ok;
if (strcmp(ComandoRecibido,"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");
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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]='\0';
Respuesta[14]='\0';
Respuesta[15]='\0';
Respuesta[16]='\0';
Respuesta[17]='\0';
Respuesta[18]='\0';
Respuesta[19]='\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

ComandoRecibido=ok;
if (strcmp(ComandoRecibido,"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");
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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]='\0';
Respuesta[16]='\0';
Respuesta[17]='\0';
Respuesta[18]='\0';
Respuesta[19]='\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

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

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



//*****************************************************************************
//CUARTO COMANDO AT
//*****************************************************************************
putst ("ATS502=1");
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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]='\0';
Respuesta[16]='\0';
Respuesta[17]='\0';
Respuesta[18]='\0';
Respuesta[19]='\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

ComandoRecibido=ok;
if (strcmp(ComandoRecibido,"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");
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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]='\0';
Respuesta[16]='\0';
Respuesta[17]='\0';
Respuesta[18]='\0';
Respuesta[19]='\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

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

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




//*****************************************************************************
//SEXTO COMANDO AT
//*****************************************************************************
putst ("AT+BTK=\"1234\"");
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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= getch();
Respuesta[12]= getch();
Respuesta[13]= getch();
Respuesta[14]= getch();
Respuesta[15]= getch();
Respuesta[16]= getch();
Respuesta[17]= getch();
Respuesta[18]= getch();
Respuesta[19]= getch();
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

ComandoRecibido=ok;
if (strcmp(ComandoRecibido,"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');

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();
Respuesta[9]=  getch();
Respuesta[10]= getch();
Respuesta[11]= '\0';
Respuesta[12]= '\0';
Respuesta[13]= '\0';
Respuesta[14]= '\0';
Respuesta[15]= '\0';
Respuesta[16]= '\0';
Respuesta[17]= '\0';
Respuesta[18]= '\0';
Respuesta[19]= '\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

ComandoRecibido=ok;
if (strcmp(ComandoRecibido,"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');

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();
Respuesta[9]=  getch();
Respuesta[10]= '\0';
Respuesta[11]= '\0';
Respuesta[12]= '\0';
Respuesta[13]= '\0';
Respuesta[14]= '\0';
Respuesta[15]= '\0';
Respuesta[16]= '\0';
Respuesta[17]= '\0';
Respuesta[18]= '\0';
Respuesta[19]= '\0';
Respuesta[20]='\0';
Respuesta[21]='\0';
Respuesta[22]='\0';
Respuesta[23]='\0';
Respuesta[24]='\0';
Respuesta[25]='\0';
Respuesta[26]='\0';
Respuesta[27]='\0';
Respuesta[28]='\0';
Respuesta[29]='\0';
Respuesta[30]='\0';
Respuesta[31]= '\0';

indice = 0;

//while(1);

while (Respuesta[indice] != '\0')
{
  if ((Respuesta[indice] == 'O') && (Respuesta[indice + 1] == 'K'))
  {
    ok[0] = Respuesta[indice];
    ok[1] = Respuesta[indice + 1];
  }
  indice++;
  ok[2] = '\0';
}


//while(1);

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

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









//***********************************************************//
//ESPERAR A QUE UN DISPOSITIVO SE QUIERA CONNECTAR AL NUESTRO//
//***********************************************************//     


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

 LeerRespuesta(aparejamiento);
if (strcmp(ComandoRecibido,"PAIR 0 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

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






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



LeerRespuesta(ring);
ComandoRecibido=ring;
if (strcmp(ComandoRecibido,"RING 008098E6A5F4") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

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




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


LeerRespuesta(connexion);
ComandoRecibido=connexion;
if (strcmp(ComandoRecibido,"CONNECT 008098E6A5F4,1101 A") == 0){ // Todo a ido bien
// while(1);
LED0=1;
error_comando=0;

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


Muchas gracias otra vez amigo
Título: Re: Error al comparar dos strings con strcmp
Publicado por: AngelGris en 22 de Enero de 2011, 19:26:10
Muchas gracias por estos ejemplos. Ya lo he preparado todo para cuando mañana lo pruebe en el lab.

De esta manera el programa se quedara esperando a los tres mensajes o hay que poner algun while para que este por alli y vaya mirandolo todo? Crees que de esta forma funcionara?

Adjunto el codigo entero de esta parte de comandos AT que es como lo tengo actualmente:

......


  La función LeerRespuesta llama sucesivamente a getch() así que se va a quedar allí "a la espera" hasta que vayan llegando los caracteres.

  No te olvides que en la implementación de getch() está el while que espera a que se setee el bit RCIF.
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 22 de Enero de 2011, 19:28:54
Puse if para controlar la variable error_comando y hice una ultima prueba para comprobar que aun seguia funcionando.
Mañana probare en el lab lo del mensaje a ver.

Entonces crees que no le falta nada al codigo no? creo que no se me escapa nada..

Ya te dire algo. Muchas gracias por la ayuda prestada :)
Título: Re: Error al comparar dos strings con strcmp
Publicado por: edu1989 en 26 de Enero de 2011, 11:01:32
Hola Angel, te escribo para darte las gracias por la ayuda prestada durante estos meses. Pude entregar el trabajo a tiempo y el lunes que viene es la defensa publica del trabajo. Ya te contare como me ha ido y aprovechare para subir todo el codigo (ya que ahora mismo no estoy en mi PC)

Un saludo y agradecerte esto que has hecho.
Un abrazo