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.
#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);
}
Here is a sketch where you can send AT commands from the terminal. Include a new line after each command:
#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.");
}
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.
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