I am using the following code for reading any incoming message, and doing something after decoding the incoming string. There is a delay of 10sec in the code. When this delay is not introduced in the code, it is working nice. In this case, the output is like below.
+CIEV: “MESSAGE”,1
+CMT: “+919080404532”,“2018/02/09,19:30:51+06”
This is an incoming test message
When the delay is introduced, I am unable to see the message on the serial monitor, and subsequent action is not taken by the code. The output is like below.
+CIEV: “MESSAGE”,1
+CMT: “+919080404532”,"2018/02/09,1
It is clear that, I am missing some character in serial monitor. If delay is reduced to 400 ms, the output is like below.
+CMT: “+919080404532”,“2018/02/09,19:30:51+06”
This is an incoI am working other job
I checked the following, but did not get any improvement.
Serial.flush and mySerial.flush
Increased both hardware, and software aerial buffer size
used if (!mySerial.available() before delay
Changed baud rate for both
Instead of of Serial.readString(), I used Serial.read() character by character inside function loop
Without use of the delay, it is working nice. I Think you guys are experienced, and can sort out the problem easily.
//while Introducing any delay in function loop, incoming message cant be read
//working with power failure but with serial monitor
#include <SoftwareSerial.h>
SoftwareSerial mySerial(9, 10); // TX-Pin11, RX-Pin10
String str="";
void updateSerial()
{
delay(2000);
while (Serial.available()) {
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available()) {
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
modemsetup();
}
void loop()
{
Serial.println(“I am working other job”);
//delay(10000); //If you give this delay, then incoming message cant be read
smstask();
}
void smstask()
{
if(mySerial.available())
{
str=mySerial.readString();
Serial.println(str);
int bra = str.indexOf(’@’);
int ket = str.indexOf(’#’);
String str1=str.substring(bra+1,ket);
if(str1==“server”)
{
Serial.println(str);
int i=random(1,500);
String str2=(String)i;
String str3="@deviceA#"+str2;
mySerial.println(“AT+CMGF=1”); //Sets the GSM Module in Text Mode
updateSerial();
mySerial.println(“AT+CMGS=”+917602304567"\r"); // Replace x with mobile number
updateSerial();
mySerial.println(str3);// The SMS text you want to send
updateSerial();
mySerial.println((char)26);// ASCII code of CTRL+Z
updateSerial();
mySerial.println(“AT+CMGD=1,4”); // AT Command to receive a live SMS
updateSerial();
}
}
}
void modemsetup()
{
for(int i=0;i<3;i++)
{
mySerial.println(“AT”); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println(“AT+CSQ”); //Signal quality test, value range is 0-31, 31 is the best
updateSerial();
mySerial.println(“AT+CCID”); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println(“AT+CREG?”); //Check whether it has registered in the network
updateSerial();
mySerial.println(“AT+SNFS=0”); //Adjust to earphone mode(AT+SNFS=1 is microphone mode)
updateSerial();
mySerial.println(“AT+CRSL=2”); //Adjust volume, volume range is 0-15, maximum:15
updateSerial();
mySerial.println(“AT+CMGF=1”);
updateSerial();
mySerial.println(“AT+CMGD=1,4”);
updateSerial();
}
mySerial.println(“AT+CMGS=”+917602304567"\r");
updateSerial();
mySerial.println(“I am SMS from GSM Module”);
updateSerial();
mySerial.println((char)26);// ASCII code of CTRL+Z
updateSerial();
}