TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: AnderOs22 en 14 de Agosto de 2015, 21:31:52
-
Que tal! Llevo tiempo con el mismo problema y espero alguien de ustedes pueda ayudarme.
Estoy realizando un proyecto en el cual tengo que realizar la comunicación de un microcontrolador (PIC16F877A) con un celular Android mediante un cliente y un servidor TCP.
Estoy conectando un modulo de comunicación wifi ESP8266 y lo configuro desde el microcontrolador mediante comunicación serial y comandos AT, el problema que tengo es que al momento en que el modulo wifi me responde, no puedo almacenar de forma correcta la respuesta que este me manda porque es como si solo mandara correctamente el comando 3 veces, y despues de esas 3 veces pareciera que el programa saliera del ciclo infinito en el que esta, por lo tanto no puedo almacenar la informacion que el PIC recibe una vez que algun cliente se conecta al servidor que se configura mediante el PIC, lo raro es que el programa que tengo grabado en el PIC funciona correctamente cuando lo pruebo comunicandolo con la PC, recibo los comandos enviados por el PIC en mi Terminal, el programa que uso es el Termite v.3.1., tambien desde este le respondo al PIC y lo que le llegue de respuesta lo muestra en un lcd correctamente.
Les adjunto el codigo que estoy manejando, es muy simple, he tratado de varias maneras y estoy con el mismo problema, espero alguien pueda hacerme alguna observación o algo que no este tomando el cuenta. De ante mano muchas gracias!
#include <16F877A.h>
#fuses NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock = 4M)
#use RS232(BAUD = 9600, BITS = 8, PARITY = N, STOP = 1, XMIT = PIN_C6, RCV = PIN_C7, STREAM = COM)
#include <lcd.c>
void Led(){ output_high(pin_d3); delay_ms(150); output_low(pin_d3); }
void main ()
{
char datoE[10];
Led();
lcd_init();
SendAT:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Enviando AT");
delay_ms(1000);
puts("AT");
while(true)
{
if (kbhit())
{
gets(datoE);
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",datoE);
break;
}
}
Led();
delay_ms(3000);
goto SendAT;
}
Como observacion, les comento que este programa solamente envia "AT" y el modulo ESP8266 respondera con un OK, asi mismo con la mayoria de los comandos, y sonando redundante, pero para que quede claro por si no me explique lo suficientemente bien, con la PC lo hace correctamente, tanto el envio como la recepcion, mientras que con el modulo ESP envia correctamente el comando AT 3 veces, pero las 3 veces, recibe como respuesta el mismo AT que envie en lugar de recibir OK.
-
Probablemente te falta el retorno de carro y el salto de linea, si no sería como si en el PC escribes "AT", y te quedas esperando a que pase algo, ¿ le tendrás que dar la tecla "Intro", no ?.
Prueba con puts("AT\r\n");
-
No, no es eso, ya que los comandos que se envian del PIC al modulo ESP los hace correctamente ya que lei que la funcion puts agrega automaticamente el salto de linea y el retorno de carro, puedes verificarlo en este link http://www.aquihayapuntes.com/programacion-pic-en-c.html?start=9 el problema que tengo es al leer la respuesta que me envia el modulo, hice la prueba con un led, que si se recibe algo, encendiera y apagara un led, y los hace 2 veces, y despues el led queda encendido como si pareciera que siempre estuviera recibiendo algo, para que me entiendas tenia esto en el codigo
while(true)
{
if (kbhit())
{
output_high(pin_d3);
delay_ms(250)
output_high(pin_d3);
}
}
Entonces lo que hacia era que parpadeaba el led 2 veces, como si esas 2 veces recibiera correctamente la informacion, y despues el led quedaba encendido como si terminando el retardo, no tuviera tiempo de apagar el led e inmediatamente ya hubiera algo que leer, o podria interpretarse asi, la verdad no estoy seguro, como te digo, con la PC hace correctamente la lectura de las respuestas, pero con el modulo es cuando ya no lo hace bien...
-
Para averiguar que ocurre, habría que echar mano del Debug. Y si puedes conectar la salida serie del PIC al PC con un MAX232, también podrás verificar, con el hyperterminal, que está enviado realmente el PIC al ESP8266.
-
Me parece que estás saturando al módulo ESP8266 entre un comando y otro.
-
Si, tambien lo he hecho, y el modulo responde correctamente, se configura correctamente, pero por alguna razon la respuesta que el modulo le envia al PIC no se almacena correctamente, y pues si solamente se tratara de configurar el modulo no habria problema, el problema es que como necesito, una vez que algun cliente se conecta al servidor que se configura en el modulo, evaluar los datos que el cliente le envia al servidor asi como que el servidor le responda al clinete, es ahi el problema, por ejemplo configuro el modulo, y conecto un cliente y hasta ahi todo va bien, me muestra en el lcd "Link" indicando que un cliente se conecto al modulo, y si el cliente envia algo, en el lcd me muestra "+IPD,0,4:Hola", en el caso en el que el cliente haya mandado "Hola", pero cuando vuelvo a enviar nuevamente algo, ya no se muestra nada en el lcd, como si no estuviera recibiendo nada el PIC pero se ve parpadear el led del modulo que indica cuando le llega algo, no se si me explique...
Gracias por sus comentarios!
-
Saturar al modulo? Pues eso me parece incorrecto, ya que antes de conectar al modulo con el pic realice la comunicacion del modulo con la PC asi mismo del modulo con un cliente TCP y monitoreando desde el Termite lo que el modulo recibia y poder responderle al cliente que se conectaba y todo andaba sin ningun problema, aun asi tomare en cuenta lo que me dices para realizar otro tipo de pruebas! Gracias!
-
cuando se satura la entrada serial rx utilizo un timeout en la configuracion del puerto serie, asi el pic sigue trabajando sin lio
#use rs232(baud=9600, parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1, timeout=500)
-
Es bien fácil, el ESP8266 tiene el modo echo en ON por default, por eso te devuelve los mismos caracteres qué le envias, o sea AT
Para apagar el echo, manda el comando ATE0 y se apagará, todo ello viene en el manual de comandos AT del ESP, y funciona en todas las versiones hasta ahorita implementadas por spressif