GSM SM5100B CMEERROR: error 4

Estoy usando Arduino para controlar un dispositivo GSM SM5100B, todo funciona, excepto cuando deseo enviar un SMS después de recibir otro. Entiendo esto,

Código de error:

OK> + CMGS: 2 5 OK + CMEERROR: 4

Mi código para manejar el SMS recibido anteriormente mencionado:

#include  //Include the NewSoftSerial library to send serial commands to the cellular module. char inchar; //Will hold the incoming character from the Serial Port. SoftwareSerial cell(2,3); char mobilenumber[] = "0597010129"; void setup() { //GSM Serial.begin(9600); // opens serial port, sets data rate to 9600 bps Serial.println("Initialize GSM module serial port for communication."); cell.begin(9600); delay(35000); // give time for GSM module to register on network etc. Serial.println("delay off"); cell.println("AT+CMGF=1"); // set SMS mode to text delay(200); cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt delay(200); } void loop() { if(cell.available() >0)//If a character comes in, from the cellular module { inchar=cell.read(); Serial.println(inchar); if (inchar=='#'){ // OK - the start of our command delay(10); inchar=cell.read(); Serial.println(inchar); if (inchar=='a'){ delay(10); Serial.println("The folowing SMS : \n"); inchar=cell.read(); Serial.println(inchar); if (inchar=='0'){ //sequance = #a0 Serial.println("#a0 was received"); } else if (inchar=='1'){//sequance = #a1 Serial.println("#a1 was received "); sendSms(); } } cell.println("AT+CMGD=1,4");// AT command to delete all msgs Serial.println(" delete all SMS"); } }//end of if(cell.available() >0) {...} } void sendSms(){ //cell.println("AT+CMGF=1"); // set SMS mode to text cell.print("AT+CMGS="); // now send message... cell.print((char)34); // ASCII equivalent of " cell.print(mobilenumber); cell.println((char)34); // ASCII equivalent of " delay(500); // give the module some thinking time cell.print(":D hello m3alleg :D"); // our message to send cell.println((char)26); // ASCII equivalent of Ctrl-Z delay(20000); } 

Nota general sobre su manejo de comandos AT.

¡No no no! Esta forma de hacerlo nunca funcionará de manera confiable. DEBE esperar a que se reciba el caracter > antes de enviar “texto para enviar”. O en realidad no es solo el caracter > , son cuatro caracteres. Cita de la especificación 3GPP 27.005 :

  • el TA enviará una secuencia de cuatro caracteres (IRA 13, 10, 62, 32) después de que la línea de comando finalice con ; después de eso, el texto puede ingresarse de TE a ME / TA.

(TA (adaptador de terminal) aquí significa módem y TE (equipo terminal) el emisor de comandos AT)

Para cualquier comando AT abortable (y 27.005 indica claramente para AT + CMGS, This command should be abortable. ) This command should be abortable. El envío de cualquier carácter cancelará la operación del comando. Para citar ITU V.250 :

5.6.1 Cancelación de comandos

El aborto de comandos se lleva a cabo mediante la transmisión desde el DTE al DCE de cualquier personaje.

(DCE (equipo de comunicación de datos) aquí significa módem y DTE (equipo terminal de datos) el emisor de comandos AT)

Esto significa que cuando envía “texto para enviar” antes de que el módem envíe “\ r \ n>”, el comando se cancelará. No hay forma de esperar “el tiempo suficiente” para esperar que se envíe la respuesta. DEBE leer y analizar el texto de respuesta que obtiene del módem.

Lo mismo aplica para el código de resultado final después de cada comando (por ejemplo, OK , ERROR , CME ERROR y algunos más). Por ejemplo, enviar “AT + CMGF = 1” y luego enviar el siguiente comando sin esperar primero a que OK esté mendigando problemas. Por lo tanto, siempre al enviar comandos AT, DEBE esperar el código de resultado final antes de enviar el siguiente comando.

Nunca, nunca use la delay para esperar una respuesta de comando AT. Es tan útil como patear perros que se interponen en tu camino para que se muevan. Sí, en realidad podría funcionar algunas veces, pero en algún momento lamentará tomar ese enfoque …

Responde a tu pregunta

En función de la respuesta que reciba, puedo ver que su problema no es el aborto por comando (aunque su análisis tiene serios problemas, como se describió anteriormente, que debe corregir), y el ERROR de CME es su mejor pista. De la sección “9.2.1 Errores generales” en 27.007 da operation not supported como descripción para el valor 4.

27.005 establece que:

Si el envío falla en una red o un error ME, se devuelve el código de resultado final + ERROR DE CMS:

Tenga en cuenta que esto es + ERROR DE CMS y no + ERROR de CME, pero es aplicable, consulte a continuación.

Supongo que esa secuencia de acciones es la siguiente:

El comando AT que maneja parte del módem SM100B GSM acepta los datos SMS y los formatea en un formato apropiado y los envía a la parte del módem que se comunica con la red GSM. Envía con éxito los datos de sms a la red y los informa a la parte de manejo del comando AT que luego imprime +CMGS: 25 y el código de resultado final OK . Sin embargo, después de un corto tiempo, la red envía de vuelta un mensaje de rechazo para el sms, que luego se da como la respuesta + ERROR CME.

Si mi suposición anterior es correcta, ¿la respuesta debería haber sido entregada como + ERROR DE CMS en su lugar? No, porque la respuesta final para el comando AT + CMGS ya se ha dado (OK), y nunca se deben devolver múltiples códigos de resultado final para un comando (excepto por error (nota 1)). Y aunque + CME ERROR puede reemplazar el código de resultado final de ERROR, no es solo un código de resultado final. De la descripción del comando AT + CMEE:

El comando Set deshabilita o habilita el uso del código de resultado + CME ERROR: como una indicación de un error relacionado con la funcionalidad del MT. Cuando está habilitado, los errores relacionados con MT causan + CME ERROR: código de resultado final en lugar del código de resultado final de ERROR normal. ERROR se devuelve normalmente cuando el error está relacionado con la syntax, los parámetros no válidos o la funcionalidad TA.

Por lo tanto, + CME ERROR puede ser tanto un código de resultado final como un código de resultado no solicitado (posiblemente también un código de resultado intermedio).

¿Pero no podría haber esperado el comando AT + CMGS para recibir el rechazo de la red y haber devuelto + ERROR DE CMS? Probablemente no. Sin saber demasiado sobre los detalles de la red del envío de sms, podría darse el caso de que el rechazo de hoy pueda ocurrir mucho más tarde que antes. Dichos cambios son a veces un problema con los comandos AT relacionados con GSM que tienen una herencia antigua que originalmente estaba estrechamente ligada al comportamiento de GSM que algunas veces se vuelve cada vez menos cierta a medida que la tecnología se mueve a GPRS, UMTS, LTE, etc.

Nota 1:

Uno de mis antiguos colegas solía quejarse sobre la forma en que el estándar ha especificado el manejo de llamadas de voz, porque después de un ATD1234; primero ordena el código de resultado final, y luego, cuando finaliza la llamada, obtienes un nuevo código de resultado final SIN TRANSPORTISTA. Este diseño terriblemente malo, la indicación de fin de llamada debería haber sido una respuesta no solicitada específica y no una respuesta final.

Entonces para resumir

Su sms parece ser rechazado por la red. Intenta descubrir por qué. También tienes algunos problemas serios con el manejo de tu comando AT que debes corregir; no hay forma de manejar comandos AT sin leer y analizar el texto de respuesta del módem.

cell.println (“AT + CNMI = 3,3,0,0”); // configurar el módulo para enviar datos de SMS a la salida de serie al recibirlos

Para cualquiera que esté buscando una respuesta al mismo problema, tuve:

Estaba intentando despertar el módulo gsm del modo de suspensión enviando sms y no funcionó de inmediato. La llamada telefónica va directamente a UART, pero para los SMS debe usar este comando para configurar el módulo y enviar datos SMS al puerto serie al recibirlos.

AT + CNMI = 3,3,0,0

¡Muchas gracias por publicar esto!