Hi,
I have an Arduino Ethernet board with an Arduino GSM shield. During testing and after excluding causes like power supply, bad connections, it appeared that the SoftwareSerial communication is unreliable. To demonstrate the problem I used this code (which is apart from demonstration purposes useless):
#include <SoftwareSerial.h>
char incoming_char = 0;
SoftwareSerial gsm(5,6);
void setup()
{
// Initialize serial ports for communication.
Serial.begin(9600);
// Reset
Serial.println("Start Reset");
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
delay(12000);
digitalWrite(7, LOW);
delay(1000);
Serial.println("End Reset");
gsm.begin(9600);
}
void loop()
{
if(gsm.available() > 0)
{
incoming_char = gsm.read();
Serial.print(incoming_char);
}
gsm.println("AT");
delay(200);
}
I use pin 5 and 6 for the communication, because I need pin 2 and 3 for interrupt handling later on in the development of my project.
The result I get is:
Start Reset
End Reset
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OKAAAAAAAAAüAAñAAAAAAAAAAStart Reset
End Reset
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK-áAT
OK
AT
OKAAAAAAAñ(AAAáAAAAAAAAAAAStart Reset
End Reset
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
OK
AT
MèjªAAAAAAA?AAAAAAA
As you can see, after about eight AT commands communication fails and I gave a manual reset.
What can be the cause? Hardware related (clock frequency of the Ethernetboard)?
Any suggestions appreciated.
delay(200);
How big is your input buffer?
Thanks for your reply.
I changed the code in the void loop to:
void loop()
{
while(gsm.available())
{
incoming_char = gsm.read();
Serial.print(incoming_char);
}
gsm.println("AT");
delay(700);
}
Only with the 700 ms (and longer) delay I get no errors. So it seems to be a buffer overrun.
I will have a look at my original code next week and see if I can solve the problems there too.
Thanks again.
I started all over with testing and used the Send SMS example from GSM library reference page.
/*
SMS sender
This sketch, for the Arduino GSM shield,sends an SMS message
that you send it through the serial monitor. To make it work,
open the serial monitor, and when you see the READY message,
type a message to send. Make sure the serial monitor is set
to send a newline when you press return.
Circuit:
* GSM shield
created 25 Feb 2012
by Tom Igoe
This example is in the public domain.
*/
// libraries
#include <GSM.h>
#define PINNUMBER ""
// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSM_SMS sms;
void setup()
{
// initialize serial communications
Serial.begin(9600);
Serial.println("SMS Messages Sender");
// connection state
boolean notConnected = true;
// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("GSM initialized");
}
void loop()
{
Serial.print("Enter a mobile number: ");
char remoteNumber[20]; // telephone number to send sms
readSerial(remoteNumber);
Serial.println(remoteNumber);
// sms text
Serial.print("Now, enter SMS content: ");
char txtMsg[200];
readSerial(txtMsg);
Serial.println("SENDING");
Serial.println();
Serial.println("Message:");
Serial.println(txtMsg);
// send the message
sms.beginSMS(remoteNumber);
sms.print(txtMsg);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
}
/*
Read input serial
*/
int readSerial(char result[])
{
int i = 0;
while(1)
{
while (Serial.available() > 0)
{
char inChar = Serial.read();
if (inChar == '\n')
{
result[i] = '\0';
Serial.flush();
return 0;
}
if(inChar!='\r')
{
result[i] = inChar;
i++;
}
}
}
}
A few times only
SMS Messages Sender
was displayed, probably because communication failed right away.
This was one of the results (I crossed out my phone number):
SMS Messages Sender
GSM initialized
Enter a mobile number: 06********
Now, enter SMS content: SENDING
Message:
goedemiddag
CO
ª?UT$¡H¨Ô?W?.¤XHé?þ
and another one:
SMS Messages Sender
GSM initialized
Enter a mobile number: 06********
Now, enter SMS content: SENDING
Message:
goedemiddag
COMPLETE!
Enter a mobP?«¹Õµ??Éé?þ
The messages where received ok.
So again, what can be the cause?