我的代码使用的是ATMega328p和GSM Shield(Sim900)。
该代码显示,如果GSM接收到"FILL"
关键字的特定文本,它将在串行监视器上打印为"FILL in thr"
,如果GSM收到" AUTOMATIC"关键字,它将在串行监视器"AUTOMATIC asd"
上打印。
代码仅适用于FILL上的第一个代码,但如果我发送了关键字AUTOMATIC
,则串行监视器中没有任何内容。
我的代码中是否有问题?
#include <SoftwareSerial.h>
#include <string.h>
char str = 0;
char str1 = 0;
SoftwareSerial gsm = SoftwareSerial(2,3);
boolean gsmConnected = false;
void setup()
{
Serial.begin(9600);
gsm.begin(9600);
delay(300);
do // initializing connection between gsm shield and gizduino
{
Serial.println("------------------------------------------");
Serial.println("Initializing GSM Shield Connection..");
delay(500);
Serial.println("Sending AT Command...");
delay(500);
gsm.println("AT");
delay(500);
if(gsm.available())
{
if(gsm.find("OK"))
{
Serial.println("GSM Shield replied 'OK'"); //gsm shield replied "OK"
gsmConnected = true;
gsm.print("\r");
delay(500);
}
else
{
Serial.println("Error!.. GSM Shield Not Communicating");
gsmConnected = false;
}
}
}
while(gsmConnected == false);
Serial.println("Communicating.....");
gsm.print("\r");
delay(500);
gsm.print("AT+CMGF=1\r"); // sms format = text mode
delay(500);
gsm.write(0x1A);
Serial.println("READY!\r");
}
void loop()
{
//IF OWNER TEXTS FILL KEYWORD
if(gsm.available())
{
if(gsm.find("+639229639893") && gsm.find("FILL"))
{
Serial.println("FILL in thr");
}
}
//IF OWNER TEXTS AUTOMATIC KEYWORD
if(gsm.available())
{
if(gsm.find("+639229639893") && gsm.find("AUTOMATIC"))
{
Serial.println("AUTOMATIC asd");
}
}
}
答案 0 :(得分:0)
将do {}更改为循环{}应该有所帮助,请务必删除不必要的print.ln
在while循环条件
的末尾有一个冒号在启动序列之前启动GSM的良好做法。 还可以在共享草图时将垃圾数据设置为手机号码
答案 1 :(得分:0)
使用gsm.find清除缓冲区,直到找到关键字..基于您的代码...第一个if语句搜索数字和关键字&#34; fill&#34;。所以,即使你自动发短信,代码也会首先搜索关键字fill,从而删除关键字&#34; automatic&#34;来自缓冲区。最好先将串行数据存储到变量数组中。