Hello,
I have the following problem:
I use the 3G/GPRS shield on an Arduino Uno and the
example with sending an SMS works just fine.
However, when I want to send multiple SMS, only the
first one gets sent, every further sending command
will return an error. Has anybody any idea as to why this
could happen?
Below is the code, but it is only a sligthly modified
version of the example.
Any help would be appreciated.
Code:
int8_t answer;
int onModulePin= 2;
char aux_str[30];
//Change here your data
const char pin[]="****";
const char phone_number[]="MYNUMBER";
const char sms_text[]="Anytext";
void setup(){
pinMode(onModulePin, OUTPUT);
Serial.begin(115200);
Serial.println("Starting...");
//power_on();
sendsms();
delay(10000);
sendsms();
}
void loop(){
}
void sendsms(){
//sets the PIN code
sprintf(aux_str, "AT+CPIN=%s", pin);
sendATcommand(aux_str, "OK", 2000);
delay(3000);
Serial.println("Connecting to the network...");
while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) ||
sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );
Serial.print("Setting SMS mode...");
sendATcommand("AT+CMGF=1", "OK", 1000); // sets the SMS mode to text
Serial.println("Sending SMS");
sprintf(aux_str,"AT+CMGS=\"%s\"", phone_number);
answer = sendATcommand(aux_str, ">", 2000); // send the SMS number
if (answer == 1)
{
Serial.println(sms_text);
Serial.write(0x1A);
answer = sendATcommand("", "OK", 20000);
if (answer == 1)
{
Serial.print("Sent ");
}
else
{
Serial.print("error ");
}
}
else
{
Serial.print("error ");
Serial.println(answer, DEC);
}
}
void power_on(){
uint8_t answer=0;
// checks if the module is started
answer = sendATcommand("AT", "OK", 2000);
if (answer == 0)
{
// power on pulse
digitalWrite(onModulePin,HIGH);
delay(3000);
digitalWrite(onModulePin,LOW);
// waits for an answer from the module
while(answer == 0){ // Send AT every two seconds and wait for the answer
answer = sendATcommand("AT", "OK", 2000);
}
}
}
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // Initialice the string
delay(100);
while( Serial.available() > 0) Serial.read(); // Clean the input buffer
Serial.println(ATcommand); // Send the AT command
x = 0;
previous = millis();
// this loop waits for the answer
do{
// if there are data in the UART input buffer, reads it and checks for the answer
if(Serial.available() != 0){
response[x] = Serial.read();
x++;
// check if the desired answer is in the response of the module
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
// Waits for the answer with time out
}
while((answer == 0) && ((millis() - previous) < timeout));
return answer;
}