Autor Tema: Pic16f628a USART problema para recibir  (Leído 6492 veces)

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

Desconectado dino60

  • PIC10
  • *
  • Mensajes: 1
Re: Pic16f628a USART problema para recibir
« Respuesta #15 en: 04 de Octubre de 2015, 01:29:59 »
Fjgkgkfkg

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Pic16f628a USART problema para recibir
« Respuesta #16 en: 16 de Octubre de 2015, 19:45:15 »
Hola a todos .. alguien me puede dar una mano ?? tengo el siguiente problema

leo caracteres de una uart , de a uno, dentro de el void interrupt  de esta manera:

//Read the data
    char data=RCREG; // valores que ingresan por la uart

        if (cone[a] == data)
          {
           conect[a] = data ;
           a++ ;
          }

por la uart ingresa la palabra (CONECTADO)CLOSED ....al final

las variables son las sig

char cone[] = "(CONECTADO)"; y

char conect[11];

desp que terminan de entrar los datos por la uart hago esto

if (0 == strcmp(conect, "(CONECTADO)"))
                  Lcd_Write_String("conexion exitosa");

pero el if no se valida ...me estoy confundiendo con los strings pero no me doy cuenta donde ...

cundo escribo  Lcd_Write_String("conect");

en el display veo (CONECTADO)CONEC

en lugar de solamente (CONECTADO)

Gracias

espero haberme explicado bien


Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Pic16f628a USART problema para recibir
« Respuesta #17 en: 16 de Octubre de 2015, 20:18:27 »
Hola Rseliman.
Cambia esto: char conect[11] por esto char conect[12]
Y nos comentas.
Otra cosa prueba el programa paso a paso en el proteus si lo tienes a mano.  :mrgreen:

Saludos

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Pic16f628a USART problema para recibir
« Respuesta #18 en: 16 de Octubre de 2015, 20:23:51 »
Gracias RALF2 ...ya probe pero sigo con lo mismo ...evidentemente lo que estoy comparando no es lo mismo ...pero no entiendo porque





Hola Rseliman.
Cambia esto: char conect[11] por esto char conect[12]
Y nos comentas.
Otra cosa prueba el programa paso a paso en el proteus si lo tienes a mano.  :mrgreen:

Saludos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Pic16f628a USART problema para recibir
« Respuesta #19 en: 16 de Octubre de 2015, 20:28:09 »
Veamos, si estas enviando solo los siguentes caracteres: "(CONECTADO)", al realizar la comparacion deberia funcionarte bien, pero si envias otros caracteres distintos alli abra problemas.
Lo estas probando en fisico o con el simulador?
Otra cosa que me parece que podria estar probocando el problema es aqui:
if (0 == strcmp(conect, "(CONECTADO)"))
debria ser asi:
if (0 == strcmp(conect, cone)

Saludos
« Última modificación: 16 de Octubre de 2015, 20:34:54 por RALF2 »

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Pic16f628a USART problema para recibir
« Respuesta #20 en: 16 de Octubre de 2015, 20:34:21 »
Listo RALF2 mil gracias ...si si al parecer era 12 en lugar de 11 en conect...recien lo probe nuevamente y anduvo , el tema es que es la devolucion de un esp8266 y cuando no se conecta no devuelve (CONECTADO) ..y creo recien se corto un seg internet por eso pense que no andaba , pero bueno ya se soluciono ...mil gracias nuevamente ...si si estoy con xc8 ..y probando en fisico ....

ahora me tocan otras comparaciones para estar seguro y tener una indicacion visual de que el esp8266 se conecto ...


Abrazo y gracias


Veamos, si estas enviando solo los siguentes caracteres: "(CONECTADO)", al realizar la comparacion deberia funcionarte bien, pero si envias otros caracteres distintos alli abra problemas.
Lo estas probando en fisico o con el simulador?
Y el compilador que estas utilizando es el XC8?

Saludos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pic16f628a USART problema para recibir
« Respuesta #21 en: 16 de Octubre de 2015, 20:36:57 »
No me gusta la forma de obtener el dato. Realmente tenes un  "(CONECTADO)" ? Y siempre es asi ? Yo pense que era una respuesta de HTTP, y si la palabra que buscabas estaba ubicada en el lugar que decis te indicaba desde donde tenias que tomar los datos.

Código: [Seleccionar]
+IPD,175:HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Sep 2015 14:03:28 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.3.29
X-Proxy-Cache: BYPASS

(CONECTADO)CLOSED

Como que primero debes SI o SI saber si la respuesta fue correcta por lo cual analizar y encontrar el 200 al comienzo ( 1era linea ) es fundamental, luego analizas la respuesta de la pagina que creo que es ese "(CONECTADO)" que esperas.

Si es una pagina tuya entonces ni te compliques ponerle parentesis ya que son 2 caracteres mas a comparar, a no ser que quieras asegurarte. Sabes que la respuesta del HTTP, viene seguido de un doble salto y sabes CUAL es la respuesta si o si del HTTP.

Entonces:
- Para obtener el codigo de respuesta, tenes que parsear la primera linea, una maquina de estado que lo haga y listo. que guarde el string de la primer linea ( hasta el \n ) Luego podes buscar los 2 espacios en blancos " " y lo que esta entre medio de eso es.. tu codigo de respuesta. Te aseguras que sea 200.
- Finalmente seguis recibiendo, si era 200 te va a importar obviamente, sino omitis todo no guardas nada y das aviso que un problema ocurrio , de tener un 200 cuando detectas un doble salto, comenzas nuevamente a guardar la linea. Aca Creo que hay 2 opciones:
Si es tu codigo (el del PHP), sabes exactamente la respuesta que te va a dar, lo cual podes tratar de encontrar el "(CONECTADO)" Ya que va a tener la respuesta exacta a tu codigo .
Si no es tu codigo ( el de PHP), podes restringir a que guarde solo algunos caracteres ( digamos unos 15 ) o hasta que encuentre un nuevo salto de linea. Y nuevamente comparar.

Al menos es lo que haria yo. Me aseguro de una falla de conexcion, de cualquier otra respuesta del servidor buscando el 200, y luego busco la respuesta, que se que va a comenzar luego del doble salto.

Con respecto a tu codigo:

char cone[] = "(CONECTADO)"; Eso, en realidad es esto '(','C','O','N','E','C','T','A','D','O',')','\0'  (son 12, no 11)

En una respuesta asi:

(CONECTADO)CLOSED

Y no tenes ese caracter nulo, Entonces veamos por parte:

Código: [Seleccionar]
        if (cone[a] == data)
          {
           conect[a] = data ;
           a++ ;
          }

hacer eso, si a termina siendo 11 al final del if, indica que realmente la palabra esta ahi, y no volver a "chequear" con el strcmp, es redundante.
Por otra parte tu codigo no distinguiria de esto:

a(ewqClalaOewqNerrEtgCdTasAetDyhOm)eC3L123O5SasEgDwq

Lo cual nuevamente no es correcto :P.
Y otro problema MAS!
Una ves que "a" supera 10 que es el limite del array "conect" estarias ESCRIBIENDO las posiciones de memoria siguientes que tal ves responden a data u otra variable, o tal ves por suerte no exista nada alli

Me explico, si tenes los datos asi en memoria:

conect[0]   -- a = 0
conect[1]
....
conect[10] -- a = 10
otra variable         -- a = 11
Sabra dios que hay aca -- a = 12 y asi... ( Lo cual NUNCA termina! )

Para C terminar una string necesita un 0x00, asi que va a continuar grabando hacia abajo hasta que "a" tenga un overflow o dejes de meterle datos, y cuando vos haces un printf, va a enviar todos los valores hasta que encuentre el primer 0x00 ( '\0' )

Entonces Podes hacer una cosa simple y tenerlo funcionando pero no evita los errores anteriores:

Reformar a conect haciendolo de 12 lugares

char conect[12];

Y luego el codigo:
Código: [Seleccionar]
        if (cone[a] == data)
          {
           conect[a] = data ;
           a++ ;
          }
if (a==11)
{
// Encontre la palabra
conect[a] = '\0';
a=0; // Asi no molesta y esta listo a recibir otra ves
Lcd_Write_String("conect");
}

Nuevamente te repito, esto NO evita otros problemas que puedas tener y que nombre antes. Solamente es un "fix" a tu programa.

PD: 3 respuestas mientras que escribi esto e.e
« Última modificación: 16 de Octubre de 2015, 20:39:06 por KILLERJC »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Pic16f628a USART problema para recibir
« Respuesta #22 en: 16 de Octubre de 2015, 20:37:16 »
Ah perfecto de todas formas modifique el post, para ver otra opcion que me parecio que podria dar problemas pero si te funciono pos dejalo asi!  :mrgreen:

Saludos

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Pic16f628a USART problema para recibir
« Respuesta #23 en: 16 de Octubre de 2015, 20:54:01 »
Gracias KILLERJC  ..te respondo sobre tus preguntas



No me gusta la forma de obtener el dato. Realmente tenes un  "(CONECTADO)" ? Y siempre es asi ?


Si tengo siempre un (CONECTADO) , simpre que tenga internet ,,y que el esp8266 logre conectarse antes de esto




Yo pense que era una respuesta de HTTP, y si la palabra que buscabas estaba ubicada en el lugar que decis te indicaba desde donde tenias que tomar los datos.

Código: [Seleccionar]
+IPD,175:HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Sep 2015 14:03:28 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.3.29
X-Proxy-Cache: BYPASS

(CONECTADO)CLOSED



Si si asi es esa es la pagina que me tira el conectado , la cual es propia y esta escrita en PHP por mi



Como que primero debes SI o SI saber si la respuesta fue correcta por lo cual analizar y encontrar el 200 al comienzo ( 1era linea ) es fundamental, luego analizas la respuesta de la pagina que creo que es ese "(CONECTADO)" que esperas.


el tema es que el (CONECTADO) aparece porque vailda datos en una base de datos ...o sea que el 200 podria aparecer igual y no asi el conectado ...por eso me aseguro que esta todo bien si tengo el conectado ...



Si es una pagina tuya entonces ni te compliques ponerle parentesis ya que son 2 caracteres mas a comparar, a no ser que quieras asegurarte. Sabes que la respuesta del HTTP, viene seguido de un doble salto y sabes CUAL es la respuesta si o si del HTTP.

Entonces:
- Para obtener el codigo de respuesta, tenes que parsear la primera linea, una maquina de estado que lo haga y listo. que guarde el string de la primer linea ( hasta el \n ) Luego podes buscar los 2 espacios en blancos " " y lo que esta entre medio de eso es.. tu codigo de respuesta. Te aseguras que sea 200.
- Finalmente seguis recibiendo, si era 200 te va a importar obviamente, sino omitis todo no guardas nada y das aviso que un problema ocurrio , de tener un 200 cuando detectas un doble salto, comenzas nuevamente a guardar la linea. Aca Creo que hay 2 opciones:
Si es tu codigo (el del PHP), sabes exactamente la respuesta que te va a dar, lo cual podes tratar de encontrar el "(CONECTADO)" Ya que va a tener la respuesta exacta a tu codigo .
Si no es tu codigo ( el de PHP), podes restringir a que guarde solo algunos caracteres ( digamos unos 15 ) o hasta que encuentre un nuevo salto de linea. Y nuevamente comparar.

Al menos es lo que haria yo. Me aseguro de una falla de conexcion, de cualquier otra respuesta del servidor buscando el 200, y luego busco la respuesta, que se que va a comenzar luego del doble salto.

Con respecto a tu codigo:

char cone[] = "(CONECTADO)"; Eso, en realidad es esto '(','C','O','N','E','C','T','A','D','O',')','\0'  (son 12, no 11)


si si de acuerdo con eto me comi el \0



En una respuesta asi:

(CONECTADO)CLOSED

Y no tenes ese caracter nulo, Entonces veamos por parte:

Código: [Seleccionar]
        if (cone[a] == data)
          {
           conect[a] = data ;
           a++ ;
          }

hacer eso, si a termina siendo 11 al final del if, indica que realmente la palabra esta ahi, y no volver a "chequear" con el strcmp, es redundante.
Por otra parte tu codigo no distinguiria de esto:

a(ewqClalaOewqNerrEtgCdTasAetDyhOm)eC3L123O5SasEgDwq

Lo cual nuevamente no es correcto :P.
Y otro problema MAS!
Una ves que "a" supera 10 que es el limite del array "conect" estarias ESCRIBIENDO las posiciones de memoria siguientes que tal ves responden a data u otra variable, o tal ves por suerte no exista nada alli

Me explico, si tenes los datos asi en memoria:

conect[0]   -- a = 0
conect[1]
....
conect[10] -- a = 10
otra variable         -- a = 11
Sabra dios que hay aca -- a = 12 y asi... ( Lo cual NUNCA termina! )



habia contemplado el que no se pase de 11 y se lo saque pero si me doy cuenta de lo que pasa ...muchas gracias !!!

Para C terminar una string necesita un 0x00, asi que va a continuar grabando hacia abajo hasta que "a" tenga un overflow o dejes de meterle datos, y cuando vos haces un printf, va a enviar todos los valores hasta que encuentre el primer 0x00 ( '\0' )

Entonces Podes hacer una cosa simple y tenerlo funcionando pero no evita los errores anteriores:

Reformar a conect haciendolo de 12 lugares

char conect[12];

Y luego el codigo:
Código: [Seleccionar]
        if (cone[a] == data)
          {
           conect[a] = data ;
           a++ ;
          }
if (a==11)
{
// Encontre la palabra
conect[a] = '\0';
a=0; // Asi no molesta y esta listo a recibir otra ves
Lcd_Write_String("conect");
}

Nuevamente te repito, esto NO evita otros problemas que puedas tener y que nombre antes. Solamente es un "fix" a tu programa.

PD: 3 respuestas mientras que escribi esto e.e



Mil gracias ....voy a seguir programando otro rato ...es un proyecto largo y lo agarro de vez en cuando

Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!


 

anything