Estoy realizando un proyecto con una placa de arduino y un módem de Quectel. Me comunico con el módem a través del Serial1 y quiero mostrar la información por Serial al pc.
En la función LOOP mando el comando Serial1.write(ATI\r\n) y el módem me lo reconoce y me contesta.
El módem siempre termina su comunicación con "OK" o con "ERROR".
Con este código veo por un terminal la respuesta del modem.
Lo que me que gustaría y no tengo claro cómo hacer es que el programa mande un comando, espere por un OK o un ERROR y luego siga el programa, con otro comando y siga esperando por un "OK".
Es decir, algo como:
Serial1.write(Comando_AT1);
while(!Serial1.available()) {
// Aca estaria esperando la primer respuesta
}
delay(250); // Este delay lo pondría para asegurarme de que llegaron los datos de la primer respuesta completos
// En este punto ya tendrias datos entrantes y ahi discriminarias el "OK" del "ERROR" y tendrias que hacer lo que necesitas
String primerRespuesta = Serial1.readString();
if(primerRespuesta == "OK") {
// Revisa que es exactamente lo que te responde para saber compararlo
} else {
// Aca recibiste una respuesta de "error" si es que solo responde ok/error
}
Serial1.write(Comando_AT2);
while(!Serial1.available()) {
// Aca estaria esperando la segunda respuesta
}
delay(250); // Este delay lo pondría para asegurarme de que llegaron los datos de la segunda respuesta completos
// En este punto ya tendrias datos entrantes y ahi discriminarias el "OK" del "ERROR" y tendrias que hacer lo que necesitas
String segundaRespuesta = Serial1.readString();
if(segundaRespuesta == "OK") {
// Revisa que es exactamente lo que te responde para saber compararlo
} else {
// Aca recibiste una respuesta de "error" si es que solo responde ok/error
}
Espero haber entendido lo que necesitas y que sea de tu ayuda!
De ningún modo las respuestas a cada lecturas se hacen fuera del while() no estoy de acuerdo con lo propuesto por @Mati7
Se establece un while() y ahi se lee todo lo que este disponible desde el 1ro al último caracter, si es un OK se puede por ejemplo levantar un flag, de hecho eso es lo que busca.
Lo mas lógico entonces seria una función que devuelva true/false de acuerdo a que recibe o no OK.
Esta librería lo hace todo perfectamente GSM Library
Observa GSM.cpp y verás cosas como ésta
if (!dte->ATCommand(buffer)) return false;
if (!dte->ATResponseOk()) return false;
Cómo lo hace?
usa esto
bool DTE::ATResponseOk(unsigned long timeout) {
ATResponse(timeout);
return isResponseOk();
}
y ATResponse(timeout) es así
y bueno la parte complicadita es esta solo en parte porque es mas larga. Tiene implementado un timout por si se corta la comunicación una vez comenzada la llegada de datos.
while (true) {
if (hardwareSerial) {
while (hardwareSerial->available() > 0) {
buffer[i++] = hardwareSerial->read();
t = millis();
if (i >= 2) {
if (buffer[i - 2] == '\r' && buffer[i - 1] == '\n') break;
}
}
}
Tiene un while basicamente apunta a que puerto Serie Hard o Soft use, porque solo puse la versión hardware, y como verás lee y guarda todo en un buffer que se incrementa con cada byte recibido.
Si se supera el tiempo se interrumpirá la lectura para que no se quede esperando indefinidamente.
Y el buffer si detecta CR o LF los quita y sale tmb
Asi que es una lectura de datos o bytes recibidos del tipo genérica.
Luego comparas si OK es lo que has recibido, como he puesto antes.
Son formas diferentes de hacerlo, a mi por ejemplo me hace mucho ruido el leer un "while (true)", el while que puse es para esperar la respuesta, de esta forma sin importar cuanto tarde, cuando pases el while te aseguras de tener una respuesta.
Moderador:
Por favor Mati7 no repitas lo que ya se lee arriba.
Ahora borraré tu respuesta y dejaré solo lo que has escrito.
Lee el punto 11 al final de las normas del foro.
while (true) puede ser un arma de doble filo si uno lo programa mal pero un loop es un while(true) de modo que porqué preocuparse.
En el caso de este while(true) un break lo saca, y tiene dos formas de salir del mismo, por tiempo o sea por timeout y por caracteres CR o LF.
Esta en la librería y yo la he usado sin problemas.
Ya leí las normas (punto 11) y no veo nada mal, que el loop (parte del programa) se comporte igual que un while (true) no significa que sea considerada una buena práctica de programación, funcionar funciona, pero que funcione no significa que este bien o sea considerado una buena practica, hay muchas cosas que pueden funcionar sin estar bien...
Moderador:
Me equivoqué era el punto 14 pero ponerse a discutir es desvirtuar el hilo. En todo caso enviame un privado y lo debatimos ahi.
No hagas mas comentario de este tema un hilo que no es tuyo.
Tu respuesta del post#5 será nuevamente editada.