Go Down

Topic: Sending AT commands and receiving response (Read 3493 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