tutorial proyectos mpu6050 mercadolibre mega giroscopio codigo ccs acelerometro arduino sms at-command

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

  1. 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.
  2. 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í.
  3. 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.
  4. 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.