Go Down

Topic: Sending AT commands and receiving response (Read 3998 times) previous topic - next topic

MathiasVDA

Dec 22, 2013, 06:50 pm Last Edit: Dec 22, 2013, 09:54 pm by MathiasVDA Reason: 1
Hey all,

I just figured out how to send AT commands to the Arduino GSM Shield and get back the response. I've been struggling with this for a while so I thought to share it with you here on the forum.

This method works but is probably not the best way.

Code: [Select]
#include <GSM.h>

// initialize the library instance
GPRS gprsAccess;  // GPRS access
GSM gsmAccess(true);    // GSM access: include a 'true' parameter for debug enabled
GSMClient client;  // Client service for TCP connection

// you need modemAccess to access the function writeModemCommand
// that function allows you to specify a delay for getting the answer from the gsm module
GSM3ShieldV1DirectModemProvider modemAccess;

// PIN Number
#define PINNUMBER "xxxx"

char answer[100];

void setup()
{
 Serial.begin(9600);
 
 boolean notConnected = true;
 
 Serial.println("Connecting to the GSM network");
 
 while(notConnected){
   if(gsmAccess.begin(PINNUMBER) == GSM_READY)
     notConnected = false;
   else {
     Serial.println("Not connected, trying again");
     delay(1000);
   }
 }
 
 Serial.println("Connected.");

}

void loop()
{
 
 Serial.println("Sending AT Command.");

 Serial.println(modemAccess.writeModemCommand("AT+QNITZ=1",1000));
 delay(1000);
 Serial.println(modemAccess.writeModemCommand("AT+QNITZ?",1000));
 delay(1000);
 Serial.println(modemAccess.writeModemCommand("AT+CCLK?",1000));
 
 while(true);
}

MathiasVDA

Here is a sketch where you can send AT commands from the terminal. Include a new line after each command:

Code: [Select]
#include <GSM.h>

// initialize the library instance
GSM gsmAccess;
GPRS gprsAccess;

GSM3ShieldV1DirectModemProvider modemAccess;

// PIN Number
#define PINNUMBER "9731"

// APN info
char apn[] = {"web.pro.be"};
char login[] = {""};
char password[] = {""};

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete


void setup(){
  Serial.begin(9600);
  connectGSM();
}
void loop(){
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.print("Sending command: "+inputString);
    Serial.println(send_AT_Command(inputString,1000));
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}
String send_AT_Command(String AT_COMMAND, int tDelay){
  /*Serial.print("COMMAND: "+AT_COMMAND);
  Serial.println(modemAccess.writeModemCommand(AT_COMMAND,tDelay));
  Serial.println("-----------------------------------------------");*/
 
  return modemAccess.writeModemCommand(AT_COMMAND,tDelay);
}
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
void connectGSM(){
  boolean notConnected=true;
  Serial.println("Connecting...");
  while(notConnected){
    if(gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else delay(1000);
  }
  Serial.println("Connected to GSM, now GPRS...");

  // 1000ms bug
  delay(1000);
 
  while(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY){
    delay(1000);
  }
  Serial.println("Fully connected.");
}

xeanne928

Sir, how about in sending MMS or SMS AT commands. I am not getting any response in serial monitor like "OK" or "Error" or "CONNECT". I dont know if there is an error or none. Please help me.

MathiasVDA

what commands and which shield are you using?

xeanne928

Im using GSM/GPRS shield sir.


AT+CMMSINIT     
OK         
AT+CMMSCURL="192.40.100.20/MMSC"       
OK                         
AT+CMMSCID=1             
OK
AT+CMMSPROTO="10.124.26.94",8799       
OK                                                         
AT+SAPBR=3,1,"CONTYPE","GPRS" 
OK                           
AT+SAPBR=3,1,"APN","TATA.DOCOMO.MMS"     
OK                               
AT+SAPBR=1,1 
OK         
AT+SAPBR=2,1       
OK                             
AT+CMMSEDIT=1   
OK           
AT+CMMSDOWN="TEXT",3,5000000                         
CONNECT       
OK 



xeanne928

What functions am i going to add in order to get responses like "OK" in serial monitor ?

dtluigi

Dear Mathias,
how can I parse the modem reply?
Have you tried to read its answers?

Placido

Hi

can you help me?

I use your first code to get the time from the Network.
But the time does not change.

You have any ideia why? I try diffrents networks and they support this.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy