Cambiar baud rate A6 GPRS/GSM

Hola a todos, tengo la placa A6 GPRS/GSM montada por la empresa OPEN-SMART (concretamente ésta). Antes de nada deciros que la he conseguido hacer funcionar y realizar más o menos bien peticiones HTTP. Estoy utilizando la librería AltSoftSerial.h para poder mostrar los datos por la consola del PC a la vez que envio los datos a placa y ésta me responde.

Indagando en el manual de comandos AT del chip he descubierto que el comando AT+IPR permite modificar el baud rate que trae por defecto, que son 115200, a 9600 porque, según tengo entendido y he podido comprobar, la librería AltSoftwareSerial es buena, pero tampoco hace maravillas permitiendo un baud rate muy grande. Así que conecté la placa al PC, y usando la consola Realterm conseguí bajárselo 9600 y guardar esa configuración con el comando AT&W0 (el 0 hace referencia al único slot donde guardar la configuración de parámetros). Es clave destacar que en el punto de los Remarks (punto 2.12.4 del manual) dice:

The user defined profile will be restored automatically after power-up. Use ATZ to restore user profile and AT&F to restore factory settings. Until the first use of AT&W, ATZ works as AT&F.

Es decir, que una vez yo cambie el baud rate y guarde esa configuración con el comando AT&W0, cuando apague el A6 y lo vuelva a encender tomará esa configuración. Además, el comando ATZ fijará la configuración actual como configuración de fábrica, de lo contrario volverá a su valor por defecto (o eso es lo que yo interpreto de los comandos)

Bien, después de todo esto que os he contado, aquí viene la primera pregunta:

¿Alguien me puede explicar porque mi A6 ha vuelto a a tener un baud rate de 115200 si se supone que la configuración de fábrica la había sobreescrito para que fuese de 9600?

Y segunda pregunta:

Como la conexión con el ordenador la hago para depurar los resultados y ver que es correcto, cuando funcione dejaré de usarlo, ¿podría prescindir de la librería AltSoftSerial y conectar los pines de comunicación RX y TX del Arduino al A6 funcionando a 115200 bps para evitar más quebraderos de cabeza?

Hola PinaGamer,

Según lo que he podido leer, el comando AT&W guarda en un perfil de usuario la configuración que tengas en ese momento, para cargar esa configuración a los parametros actuales tienes que utilizar el comando AT&Z y el AT&F regresa a los parámetros de fábrica.

Ahora bien, si grabas en AT&W0 debería quedarse como predefinida la configuración que hayas guardado y ejecutarse esa configuración al arrancar, a no ser, que en el 0 esté la de fábrica y no pueda sobreescribirse, de esto no he visto nada en el manual, prueba a guardar la configuración en AT&W1 a ver si así funciona.

En cuanto a la pregunta 2, sí, una vez ya no uses el serial pc como debugger puedes conectar ahí los pines y utilizar el serial normal.

Saludos!

Hola Danicap, muchas gracias lo primero por tu respuesta.

Te explico el proceso que sigo:

1. En Realterm configuro la conexión a 115200 bps.

2. Conecto los pines RX y TX y después lo alimento por USB.

3. Seguidamente esto es lo primero que me muestra la consola:

^CINIT: 8, 2048, 1

  • ^CINIT: 16, 0, 1638430*
  • ^CINIT: 32, 0, 0*
  • +CREG: 0*
  • +CTZV:17/04/21,10:13:14,+02*
  • +CIEV: service, 1*
  • +CIEV: roam, 0*
  • +CREG: 1*

Lo cual es malo que se muestre correctamente porque eso significa que esta trabajando a 115200 bps pese a haberle fijado anteriormente los 9600 bps.

4. Le pregunto por su baud rate con el comando AT+IPR?:

*+IPR? *

  • +IPR: 115200 *
  • OK*

Efectivamente está trabajando a 115200 bps.

5. Le bajo el baud rate a 9600 con AT+IPR=9600

*+IPR = 9600 *

  • OK*

Para asegurarme, le mando un comando como puede ser ATOI (que devuelve información del dispositivo). Y efectivamente me devuelve caracteres raros, eso significa que ahora trabaja a 9600.

6. Cambio la velocidad de transmisión de la consola a 9600. Efectivamente, en la esquina inferior derecha de Realterm ha cambiado de 115200 a 9600.

7. Le vuelvo a mandar el comando AT+IPR? y su respuesta es:

*+IPR? *

  • +IPR: 9600 *
  • OK*

Ahora sí trabaja a 9600 bps.

8. Guardo la configuración actual con el comando AT&W0 (no se puede poner AT&W1 porque solo tiene un único perfil que es el 0):

*&W0 *

  • OK*

Ahora mismo, según esto, en su memoria interna he escrito que la nueva velocidad de transmisión será de 9600 bps, ¿correcto?.

9. Desconecto el A6 por unos cuantos segundos de la alimentación y de los pines RX y TX.

10. Lo vuelvo a conectar con la configuración del Realterm tal y como estaba antes: 9600 bps.

11. Obtengo los datos de inicialización del dispositivo en caracteres raros. Lo que implica que el comando AT&W0 no ha servido para nada.

Pues lo único que se me ocurría es que hubiera varios perfiles programables, siendo que sólo hay uno no tiene mucho sentido que te pase lo que te está pasando.

Al volver a iniciar y trabajar a 115200 si le mandas el comando AT&Z0 que pasa? vuelve a los 9600?

Sí, ahí sí que coge el baud rate a 9600 mandándole el comando ATZ0. Pero solo me lo coge en el programa Realterm, si lo pruebo en el Arduino no obtengo el OK. No entiendo por qué. El A6 está bien alimentado y los cables RX y TX también.

Después de darle muchas vueltas a este tema y leer y releer el manual veo que no es necesario declarar el baudrate 9600, porque ya lo tiene definido. El módulo A6 tiene la habilidad de autodetectar la velocidad del puerto serie, siempre y cuando sea uno de los siguientes:
2400
4800
9600
14400
19200
28800
33600
38400
57600
115200
230400
460800
921600
1843200

Lo que si es importante es enviar algo para que el módulo lo autodetecte y después darle algo de tiempo para que lo procese (mas tiempo cuanto menor es la velocidad):

En mi caso algo así funciona perfectamente:

    MODULOA6.begin(57600);
    MODULOA6.println("AT");   //Primer envío no aparecerá como recibido, lo utiliza el autodetect
    delay(3000);
    MODULOA6.println("AT");   //Este si que aparecerá y dará el OK
    delay(3000);
    MODULOA6.print("AT+CPIN="); //Introducimos el PIN (variable)
    MODULOA6.println(PIN);
    delay(6000);
    MODULOA6.println("AT");    //Nuevo AT para saber que todo está OK
    delay(3000);
    MODULOA6.print("ATD="); //LLama al número deseado
    MODULOA6.println(n);
    delay(20000);
    MODULOA6.println("ATH");   // Cuelga la llamada
    delay(3000);

Resultado

▒g▒b#b▒Ą▒▒1b#b▒▒Ć▒▒▒▒b'▒bAT

OK
AT+CPIN=0000

OK

^CINIT: 8, 2048, 1

^CINIT: 16, 0, 1638440

^CINIT: 32, 0, 0

+CIEV: READY

+CIEV: service,  1
+CIEV: roam, 0

+CREG: 1
AT

OK
ATD=666666666

OK
AT

OK
ATH

OK

Con velocidad 9600 tal vez tengas que enviar el comando AT varias veces para que acabe detectándolo y darle alrededor de 20 segundos de tiempo.

En cualquier caso, el módulo siempre arranca a la velocidad establecida de fábrica (115200) por lo que si utilizamos Hyperterminal o similar, veremos que al principio recibimos algo de basura hasta que el autodetect acaba.

Un saludo.