arduino - proyectos - mpu6050 mercadolibre
Obtener respuesta de comando AT (4)
Estoy usando un Arduino Uno con un módulo sim900 gps / gprs y estoy usando comandos, ¿cómo puedo obtener la respuesta de un comando (es decir, OK, ERROR) para poder hacer algo if response == "OK"
o response == "ERROR"
Necesita leer la respuesta de la conexión en serie que está hablando con el módulo con algo como:
String getResponse() {
String response = "";
while(mySerial.available()!=0){
response += mySerial.read();
}
return response;
}
( mySerial
refiere al puerto serie que está utilizando con el módulo, si solo está utilizando el puerto serie normal en los pines 0 y 1, entonces debe reemplazarlo por Serial
)
Probablemente desee recortar los espacios en blanco del principio y del final utilizando response.trim()
antes de verificar si es igual a una de las respuestas que está buscando.
Puede usar el siguiente código para leer la respuesta del Módulo GSM SIM900 justo después de emitir el comando AT.
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i++] = Serial.read();
}
Después de leer la respuesta, puede usar la función strstr()
para verificar si está '' OK '' o '' ERROR '', como se indica a continuación:
if(strstr(responce, "OK"){
/*Do your code to handle OK response*/
}
else if(strstr(responce, "ERROR"){
/*Do your code to handle ERROR response*/
}
else {
/* You got some other response*/
}
Si aún no ha leído todo el capítulo 5 de la especificación V.250 deje de leer aquí y hágalo inmediatamente, es una base importante para el resto de esta respuesta, esperaré hasta que regrese. Algunas de las referencias a los alfabetos (versión corta: ignorar esto / tratarlo como ASCII) y los registros S pueden parecer crípticos pero no te rindas, crecerá en ti rápidamente.
La única forma correcta de procesar la salida del módem es dividir la salida en líneas completas e iterar una línea completa a la vez. Esto es universal y se aplica a todos los comandos AT (con una sola excepción que se me ocurre 1 ).
Permítanme enfatizar que: solo debe dividir el texto de respuesta del módem en los límites estrictos del final de la línea ( "/r/n"
) y procesar la cadena de línea resultante en una sola operación. Entonces, realmente deberían ir e implementar la función read_line_from_modem
que sugerí en mi respuesta anterior .
Esto significa que siempre que desee verificar el código de resultado OK
, solo debe usar strcmp(line, "OK/r/n")
y no strstr o similar porque sabe que está procesando una línea completa y completa que debe comenzar con el código de resultado final al principio y siempre irá seguido de "/r/n"
2 .
Ahora hay más códigos de resultados finales que solo OK
y ERROR
, y en lugar de intentar averiguarlo solo 3 , sugiero observar is_final_result_code o isFinalResponseSuccess como se detalla en esta respuesta .
Resumen
- Siempre lea la salida del módem línea por línea, y use una función separada para hacer la lectura, retornando / modificando una cadena / buffer para contener la línea.
- Lo primero que debe hacer después de leer una línea es verificar si se trata de un código de resultado final. Escriba una función separada que tome la línea como parámetro y verifique si es así.
- Si la línea no era un código de resultado final, haga lo que sea apropiado para el (los) comando (s) AT que se está (n) ejecutando.
- Lee la siguiente línea y vuelve a 2.
1 El prefijo "/r/n> "
para AT+CMGS
es el único lugar donde hace algo un poco diferente, es decir, comienza a procesar la respuesta del módem en algo que no sea un límite de línea estricto.
2 A menos que haya configurado incorrectamente S3
y S4
lo que nunca debería hacer.
3 La lista en V.250 no está completa, existe un par más definido en 27.005 y 27.007.
Solo quería agregar que la respuesta de KHAJAS me ayudó, pero tuve que modificarla antes de que funcionara así:
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i] = Serial.read();
}
Mientras que su respuesta tenía [i ++] así que estaba incrementando i en el ciclo for y luego incrementando i nuevamente cuando almacenaba ese carácter en el índice de respuesta i.