【问题标题】:Why does Arduino mega and SIM900 won't send message if I input/read to serial monitor, different phone numbers?如果我输入/读取串行监视器,不同的电话号码,为什么 Arduino mega 和 SIM900 不会发送消息?
【发布时间】:2020-03-05 11:25:49
【问题描述】:

我是 arduino 和 gsm sim900 的新手,我目前正在使用该项目,当学生扫描他们的条形码时,它会将出勤率输入数据库并向他们的监护人发送短信。我的问题是当我尝试输入不同的数字时,例如“serial.available”和“readString(phonenumber)”,它不会发送消息,我没有收到任何错误,而且 sim 卡有 e-load/。抱歉语法不好。代码如下:

#include <SoftwareSerial.h>
SoftwareSerial SIM900A(6,7);
String number;
void setup()
{
  SIM900A.begin(9600);
  Serial.begin(9600);
  Serial.println ("SIM900A Ready");
  delay(100);
 Serial.print("Enter PHONE NUMBER: ");
 while(Serial.available()==0){}          //INPUT PHONE NUMBER
 number = Serial.readString();
 delay(500);
  Serial.println ("Type s to send message or r to receive message");

}
void loop()
{
  if (Serial.available()>0)
   switch(Serial.read())
  {
    case 's':
      SendMessage();
      break;
    case 'r':
      RecieveMessage();
      break;
  }
 if (SIM900A.available()>0)
   Serial.write(SIM900A.read());
}
 void SendMessage()
{
  Serial.println ("Sending Message");
  SIM900A.println("AT+CMGF=1");
  delay(1000);
  Serial.println ("Set SMS Number");
  SIM900A.print("AT+CMGS=\""+number+"\"\r");   //send to input phone number
  delay(1000);
  Serial.print(number);
  delay(500);
  Serial.println ("Set SMS Content");
  SIM900A.print("Message from ArduinoGSMSIM900");
  delay(100);
  Serial.println ("Finish");
  SIM900A.println((char)26);
  delay(1000);
  Serial.println ("Message has been sent");
}
 void RecieveMessage()
{
  Serial.println ("SIM900A Membaca SMS");
  delay (1000);
  SIM900A.println("AT+CNMI=2,2,0,0,0");
  delay(1000);
  Serial.write ("Unread Message done");
}

请帮助我,在此先感谢!

【问题讨论】:

    标签: arduino sms gsm sim900


    【解决方案1】:

    如果您阅读 SoftwareSerial Library documentation,您会注意到它说:

    该库具有以下已知限制:

    并非 Mega 和 Mega 2560 上的所有引脚都支持更改中断,因此只有以下引脚可用于 RX:10、11、12、13、14、15、50、51、52、53、A8 (62) , A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)。

    因此,将SoftwareSerial SIM900A(6,7); 上的线路更改为别针 6 和 7。

    【讨论】:

    • 感谢您的回复。我尝试了所有的引脚,但仍然没有发送短信。虽然当我尝试引脚 10 和 11 时,它给了我这样的错误AT+CMGF=1 OK AT+CMGS="+639206188890 " ERROR message Btw 我忘了告诉我正在使用 USB Host Shield
    • 至少当您使用pin 10和11时,您可以与SIM900模块进行通信并获得反馈。这就是你的问题(正如你所说的“我没有错误”)。如果这对您有帮助,请接受答案,以使未来的读者受益。
    • 您现在遇到的错误是一个单独的问题,与您的编码有关。例如,我注意到您的电话号码末尾有一个空格。
    • 顺便说一句,使用SIM900A.println("AT+CMGS=\""+number+"\""); 而不是SIM900A.print(),以确保所有命令都以正确的\n\r 结尾。
    【解决方案2】:

    好的,经过这么多研究,我解决了我的问题。这适用于与我有相同问题的人,他们浪费了大量时间来编写简单的代码行。 当我serial.readString() 时,输出会像@hcheung 所说的那样有一个空格,所以为了摆脱我使用number.Trim() 的那个空格,它会以精确的长度读取字符串。

    arduino GSM SIM900 的最终草图:

    #include <SoftwareSerial.h>
    SoftwareSerial SIM900A(10,11);
    String number;
    String message;
    void setup()
    {
      SIM900A.begin(9600);
      Serial.begin(9600);
      Serial.println ("SIM900A Ready");
      delay(100);
     Serial.print("Enter PHONE NUMBER: ");
     while(Serial.available()==0){}
     number = Serial.readString();
     delay(100);
     number.trim();
     delay(200);
     Serial.println(number.length());
     Serial.print("Enter MESSAGE: ");
     while(Serial.available()==0){}
     message = Serial.readString();
     delay(100);
      Serial.println ("Type s to send message or r to receive message");
    
    }
    void loop()
    {
      if (Serial.available()>0)
       switch(Serial.read())
      {
        case 's':
          SendMessage();
          break;
        case 'r':
          RecieveMessage();
          break;
      }
     if (SIM900A.available()>0)
       Serial.write(SIM900A.read());
    }
     void SendMessage()
    {
      Serial.println ("Sending Message");
      SIM900A.println("AT+CMGF=1");
      delay(1000);
      Serial.println ("Set SMS Number");
      SIM900A.print("AT+CMGS=\""+number+"\"\r");
      delay(1000);
      Serial.print(number);
      delay(500);
      Serial.println ("Set SMS Content");
      SIM900A.print(message);
      delay(100);
      Serial.println ("Finish");
      SIM900A.println((char)26);
      delay(1000);
      Serial.println ("Message has been sent");
    }
     void RecieveMessage()
    {
      Serial.println ("SIM900A Membaca SMS");
      delay (1000);
      SIM900A.println("AT+CNMI=2,2,0,0,0");
      delay(1000);
      Serial.write ("Unread Message done");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多