Como leer los comandos AT

Buenas tardes,

Estoy trabajando con comandos AT con una tarjeta Lonet, he estado intentando trabajar con las respuestas que me da la tarjeta a través mySerial.available().

El problema es que los datos son de texto como: OK, ERROR etc … y necesito pasarlo a un valor de tipo CHAR para poder trabajar con ellos.

He buscado por internet y solo encuentro ejemplos con números y no con texto.

Con este código manda el comando “AT” y la tarjeta responde OK, necesito poder trabajar con la respuesta.

Muchas gracias :slight_smile:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
int respuesta;

void setup()  
{
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 mySerial.begin(9600);

mySerial.println ("AT");
   }

void loop() // run over and over
{
 if (mySerial.available())
   Serial.write(mySerial.read());
   
 if (Serial.available())
 { 
   while(Serial.available())
   {
     mySerial.write(Serial.read());
   }
   mySerial.println();
 }   
}

Hola

Mira este ejemplo. Comandos con textos.

char caracter;
String comando;

void setup(){
    Serial.begin(9600);
}

void loop(){
  while (Serial.available()>0){
    caracter= Serial.read();
    comando.concat(caracter);
    delay(10);
  }
  if (comando.equals("hola") == true){
        Serial.println("El comando es hola");
  }      
  if (comando.equals("adios")== true){
        Serial.println("El comando es adios");
  }  
  comando="";
}

Confirmas si este ejemplo te funciona.

Un cordial saludo.

Buenos días,

Si creo que es justo lo que necesitaba, hora tengo un problema con la interpretación de la entrada de datos.

La placo Lonet responde el comando AT con un Ok pero parece que en la comparación no es igual.

He puesta la línea Serial.print(comando); para ver que contiene la variable comando y sale:

AT
OK

La variable comando escribe AT y en la siguiente línea OK. No se cómo hacer la comparación con este cambió de línea.
Que el comando tenga AT y OK no hay problema pero necesito hacer la comparación de alguna forma.
Muchas gracias

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
char caracter;
String comando;

void setup()  
{
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 mySerial.begin(9600);
 mySerial.println ("AT");

   }
void loop() // run over and over
{
  while (mySerial.available()>0){
   caracter=mySerial.read();
   comando.concat(caracter);
   delay(10);
     }
Serial.print(comando);
    
    if (comando.equals("OK") == true){
       Serial.println("El comando es OK");
 }     
 if (comando.equals("ERROR") == true){
       Serial.println("El comando es ERROR");
 } 
 comando="";
}

Cuando tu mandas AT, el sistema te responde AT y luego OK Cuando lee AT lo rechaza.. y cuando lee OK te muesta el cartel "EL comando es OK"

O no es asi?

En la línea Serial.print (comando); imprime por el puerto serie:

AT OK

Si no entiendo mal, yo mando AT y la placa LONET responde AT OK en dos líneas.

Buenas:

Puedes mostrar paso a paso que es lo que te pasa y si es posible, imágenes. Las imgáneges puedes subirlas aquí en este enlace.

http://www.subeimagenes.com

No olvidar que no es lo mismo KO que Ko. Tienes que fijarte bien lo que lee o envías. No si si puedes leer carácteres ASCII, mejor aún porque tiene más precisión.

Te esperamos las respuestas.

Saludos.

Edito:
No te había leído. ¿Qué es eso que te responde a dos líneas?

Puedes hacer un pequeño programa para disimular la máquina con Visual C#, si quieres te lo hago para que seas que si responde. Si no quieres ese programa, puedes usar el HyperTerminal de Windosw o similar.

Me imagino qu el apalca es similar a esta.

Lo he explicado como se hace en este enlace en su día que puedes ver aquí.

En pocos días me voy a poner manos a la obra para hacer un pdf unamini guía rápida de Visual Studio y Arduino.

Otra cosa. Para enviar comandos al puerto serie, dijiste que usas esto.

Serial.print(comando)

Me funcion amejor para enviar datos al puerto serie, este comando.

Serial.write(comando)

Confirma si lo que te digo es así, sustituir print por write.

Saludos.

Con Serial.write no funciona, supongo que es porque la variable comando es un String. De todas formas esta línea solo es para ver que hay en la variable “comando”.

Si estoy seguro de la respuesta, es: AT y OK en dos líneas y con mayúsculas.

Hola:

¿En dos líneas te refieres uno encima de otro?

AT OK

Saludos.

Sí, pero si por ejemplo mando la palabra TEST por ejemplo, instrucción que no existe y solo devuelve TEST pero tampoco hace la comparativa.

Que es hacer la compartiva?
El dispositivo solo responde a comandos que reconoce y devuelve respuestas preprogramadas como OK o ERROR nada mas.

Hola:

Si te o envía así, es que usa nueva línea o retorno de carro como indica aquí en este dibujo.

En Decimal 10 ó 13, en Char LF o CR. Esto carácteres son comportamientos, no se ve texto, solo lo que hace.

|500x341

Envia TEST, te devuelve lo que le has enviado, lo cual lo ha recibido. No hace nada porque lo ignora, no está programado la palabra TEST para que haga algo.

Ese es el comportamiento que hace.

|500x216 Ver imagen zoom.

Abajo un tutorial. http://cetroniconline.blogspot.com.es/2015/08/tutorial-arduino-v-modulo-lonet-gsmgprs.html

Saludos.

El problema es este trozo de código con una condicional según los datos que tiene la variable “comando” String:

if (comando.equals("OK") == true){
       Serial.println("El comando es OK");
 }    
 if (comando.equals("ERROR") == true){
       Serial.println("El comando es ERROR");
 }

La variable comando (String) contiene los datos pero no los compara correctamente con estas líneas if.

¿Podría ser por un problema con la tabla decimal que decía "Metaconta" con el decimal 10 o 13? Pero tampoco sé cómo solucionar el tema

Gracias

Mira buscando una solución encontre esta librería ArduinoSerialCommand que resuelve del modo mas simple tu problema.
Aca el ejemplo y verás como agrega los comandos y las funciones que debe invocar cada comando.
Muy fácil.
Adapta este ejemplo a tu necesidad si te parece conveniente.

// Demo Code for SerialCommand Library
// Steven Cogswell
// May 2011

#include <SoftwareSerial.h>   // We need this even if we're not using a SoftwareSerial object
                              // Due to the way the Arduino IDE compiles
#include <SerialCommand.h>

#define arduinoLED 13   // Arduino LED on board

SerialCommand SCmd;   // The demo SerialCommand object

void setup()
{  
  pinMode(arduinoLED,OUTPUT);      // Configure the onboard LED for output
  digitalWrite(arduinoLED,LOW);    // default to LED off

  Serial.begin(9600); 

  // Setup callbacks for SerialCommand commands 
  SCmd.addCommand("ON",LED_on);       // Turns LED on
  SCmd.addCommand("OFF",LED_off);        // Turns LED off
  SCmd.addCommand("HELLO",SayHello);     // Echos the string argument back
  SCmd.addCommand("P",process_command);  // Converts two arguments to integers and echos them back 
  SCmd.addDefaultHandler(unrecognized);  // Handler for command that isn't matched  (says "What?") 
  Serial.println("Ready"); 

}

void loop()
{  
  SCmd.readSerial();     // We don't do much, just process serial commands
}


void LED_on()
{
  Serial.println("LED on"); 
  digitalWrite(arduinoLED,HIGH);  
}

void LED_off()
{
  Serial.println("LED off"); 
  digitalWrite(arduinoLED,LOW);
}

void SayHello()
{
  char *arg;  
  arg = SCmd.next();    // Get the next argument from the SerialCommand object buffer
  if (arg != NULL)      // As long as it existed, take it
  {
    Serial.print("Hello "); 
    Serial.println(arg); 
  } 
  else {
    Serial.println("Hello, whoever you are"); 
  }
}


void process_command()    
{
  int aNumber;  
  char *arg; 

  Serial.println("We're in process_command"); 
  arg = SCmd.next(); 
  if (arg != NULL) 
  {
    aNumber=atoi(arg);    // Converts a char string to an integer
    Serial.print("First argument was: "); 
    Serial.println(aNumber); 
  } 
  else {
    Serial.println("No arguments"); 
  }

  arg = SCmd.next(); 
  if (arg != NULL) 
  {
    aNumber=atol(arg); 
    Serial.print("Second argument was: "); 
    Serial.println(aNumber); 
  } 
  else {
    Serial.println("No second argument"); 
  }

}

// This gets set as the default handler, and gets called when no other command matches. 
void unrecognized()
{
  Serial.println("What?"); 
}

prueba esto es simple para enviar un comando y esperar el ok, lo uso para el modulo esp8266

String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
   Serial.print(command); 
    esp8266.print(command); // send the read character to the esp8266
    
    long int time = millis();
    
    while( (time+timeout) > millis())
    {
      while(esp8266.available())
      {
        
        // The esp has data so display its output to the serial window 
        char c = esp8266.read(); // read the next character.
        response+=c;
      }  
    }
    
    if(debug)
    {
      Serial.print(response);
    }
    
    return response;
}

tembien ten en cuenta que puede hacer que no haga eco del comando suele ser ATE para desactivarlo

Hola:

¿Por qué no haces un código que envíe tramas de bytes?

Algo así en hexadecimal como la tabla ASCII.

** mBuffer[0] = 0x74;** ** mBuffer[1] = 0x75;** ** mBuffer[2] = 0x89;** ** mBuffer[3] = 0x20;** ** mBuffer[4] = 0x6C;**

Saludos.

Buenos días,

He quitado el eco con la instrucción ATE como decía maxid. Ahora el comando String solo contesta OK o ERROR.

Yo no tengo experiencia en programación pero la solución de surbyte no veo como solucionar el problema. De todas formas al poder ser quisiera no cargar mas el programa definitivo con mas librerías.

Creo que tendría que encontrar una solución simple para poder utilizar la variable comando (String) y hacer la condicional if:

if (comando.equals("OK") == true){ ** Serial.println("El comando es OK");** *} *

Metaconta, no entiendo demasiado bien tu idea, pero si pudiera convertir la variable camando (String) en un char por ejemplo.

Gracias por vuestro interés

Buenas:

Aquí hay ejemplos.

http://diymakers.es/usando-el-puerto-serie-del-arduino/

http://playground.arduino.cc/ArduinoNotebookTraduccion/Appendix4

http://forum.arduino.cc/index.php?topic=103566.0

Lo que recibes del código que te envié son estring, y en realidad es mejor para esos aparatos, recibir tramas de bytes.

Lee bien el primer enlace, tienen códigos de ejemplo.

Un cordial saludo.