接收要在串行监视器上打印的特定文本

时间:2015-01-08 01:20:18

标签: gsm arduino-uno

我的代码使用的是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");

}
}
}

2 个答案:

答案 0 :(得分:0)

将do {}更改为循环{}应该有所帮助,请务必删除不必要的print.ln

在while循环条件

的末尾有一个冒号

在启动序列之前启动GSM的良好做法。 还可以在共享草图时将垃圾数据设置为手机号码

答案 1 :(得分:0)

使用gsm.find清除缓冲区,直到找到关键字..基于您的代码...第一个if语句搜索数字和关键字&#34; fill&#34;。所以,即使你自动发短信,代码也会首先搜索关键字fill,从而删除关键字&#34; automatic&#34;来自缓冲区。最好先将串行数据存储到变量数组中。