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.
+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:
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
.
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:
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