SIM800L — AT-команды ничего не делают на последовательном мониторе Arduino

Я пытаюсь отправить AT-команды на SIM800L через последовательный монитор Arduino. Однако, когда я набираю любую команду в последовательном мониторе, ничего не происходит. Я использую Arduino MEGA 2560, а TX/RX SIM800L подключен к 9 и 10 соответственно. Вот код:

#include <SoftwareSerial.h>

SoftwareSerial GPRS(9, 10);
boolean state, lastState;

void setup()
{
  pinMode(2, INPUT_PULLUP);
  state = digitalRead(2);
  lastState = state;

  GPRS.begin(9600);
  Serial.begin(9600);

  GPRS.println("AT+CMGF=1");

  delay(1000);
}

void loop()
{
  while(GPRS.available()) {
    Serial.write(GPRS.read());
  }

  lastState = state;
  state = digitalRead(2);

  if ( state != lastState ) {
    sendSMS();
  }

  delay(500);
}

void sendSMS() {
  Serial.print("Switch was turned ");
  Serial.println(state ? "on" : "off");

  GPRS.println("AT+CMGS=\"+64XXXXXXXXX\"");

  delay(500);

  GPRS.print("Switch was turned ");
  GPRS.println(state ? "on" : "off");
  GPRS.write( 0x1a ); // символ ctrl+Z

  delay(500);
}

Мы будем очень признательны за любую помощь!

EDIT2: я забыл упомянуть, но я могу отправлять, получать и звонить из модуля GSM (с другим кодом). Однако я не могу прочитать полученные сообщения, так как я получаю только сообщение +CMT «SM», и я не могу точно использовать команды AT+CMGR или CMGL, потому что последовательный монитор ничего не делает с ними. вот код для этого:

#include <SoftwareSerial.h>
SoftwareSerial sim(9,10);
int _timeout;
String _buffer;
String number = "+639XXXXXXXXX"; //-> изменить с вашим номером
void setup() {
  delay(1000); // задержка на 7 секунд, чтобы убедиться, что модули получили сигнал
  Serial.begin(9600);
  _buffer.reserve(50);
  Serial.println("Lets go!");
  sim.begin(9600);
  delay(1000);
  Serial.println("Type s to send an SMS, r to receive an SMS, and c to make a call");
}
void loop() {
  if (Serial.available() > 0)
    switch (Serial.read())
    {
      case 's':
        SendMessage();
        break;
      case 'r':
        RecieveMessage();
        break;
      case 'c':
        callNumber();
        break;
    }
  if (sim.available() > 0)
    Serial.write(sim.read());
}
void SendMessage()
{
  Serial.println ("Sending Message");
  sim.println("AT+CMGF=1");    // Устанавливает модуль GSM в текстовый режим
  delay(1000);
  Serial.println ("Set SMS Number");
  sim.println("AT+CMGS=\"" + number + "\"\r"); //Номер мобильного телефона для отправки сообщения
  delay(1000);
  String SMS = "Wala kang jowa!";
  sim.println(SMS);
  delay(100);
  sim.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  _buffer = _readSerial();
}
void RecieveMessage()
{
  Serial.println ("SIM800L Read an SMS");
  delay (1000);
  sim.println("AT+CNMI=2,2,0,0,0"); // AT-команда для получения живого SMS
  delay(1000);
  Serial.write ("Unread Message done");
}
String _readSerial() {
  _timeout = 0;
  while  (!sim.available() && _timeout < 12000  )
  {
    delay(13);
    _timeout++;
  }
  if (sim.available()) {
    return sim.readString();
  }
}
void callNumber() {
  sim.print (F("ATD"));
  sim.print (number);
  sim.print (F(";\r\n"));
  _buffer = _readSerial();
  Serial.println(_buffer);
}

, 👍1

Обсуждение

*когда я набираю любую команду в последовательном мониторе, ничего не происходит* ... у вас нет кода для этого, @jsotola

@jsotola я думал, что он будет автоматически принимать любые AT-команды в последовательном мониторе? в любом случае я добавлю свой код, который я использовал, где я мог отправлять/получать/звонить по телефону, но не читать сообщения, которые я получаю, @YMSmash

arduino ничего не сделает сам... попробуйте этот код... https://www.arduino.cc/en/Tutorial/SoftwareSerialExample, @jsotola

Почему вы используете SoftwareSerial на Mega?!?!, @Majenko


2 ответа


Лучший ответ:

1

Не используйте SoftwareSerial на Mega2560, если вы полностью не знаете, что делаете.

SoftwareSerial не работает со многими контактами Mega2560, а поскольку есть другие доступные аппаратные последовательные порты, в любом случае редко возникает какая-либо причина прибегать к использованию SoftwareSerial.

Подключите SIM800L к контактам TX1/RX1 Mega2560, а затем установите связь с помощью предопределенного объекта Serial1.

,

Я понимаю. Я просмотрел некоторые материалы по моему вопросу в других сообщениях, и почти все говорят, что не следует использовать SoftwareSerial с Mega2560. Хотя я до сих пор не совсем понимаю, что делать. Мне просто удалить все, что связано с SoftwareSerial? Как использовать аппаратные последовательные порты; Мне все еще нужно кодировать их, как в серийном программном обеспечении, или я могу просто подключить SIM800L к TX1/RX1, не беспокоясь ни о чем другом? Глупые вопросы, которые я знаю, но я больше года не общался с Arduino, поэтому, пожалуйста, потерпите меня..., @YMSmash

Конечно, вы должны закодировать их. Вы читаете с помощью Serial1.read() и пишете с помощью Serial1.print(...) точно так же, как и в любой другой форме последовательной связи. Вы не можете просто подключить случайные вещи и ожидать, что Arduino волшебным образом узнает, что они из себя представляют и как с ними работать., @Majenko

я думаю, что я действительно хотел спросить, нужно ли мне включать другую библиотеку, такую как software serial. так что теперь мне не нужно использовать какие-либо библиотеки, верно? Чего я до сих пор не понимаю, так это того, что все используют SoftwareSerial <GSM name>(<TX>,<RX>) для подключения своих модулей GSM к Arduino, независимо от того, UNO это или Mega. Если я не должен использовать SoftwareSerial, чем мне его заменить? Или я что-то здесь совсем пропустил?, @YMSmash

Библиотеки не нужны. Нечего определять. Serial1 уже определен для вас. Просто используйте Serial1.print() и Serial1.read(), где вы используете sim.print() и sim.read() и так далее., @Majenko

о, так что я могу просто сделать что-то вроде sim (<TX>, <RX>) без чего-либо перед ним, а затем он уже определен как Serial1?, @YMSmash

Нет. Вы не определяете *ничего*. Вы просто используете Serial1., @Majenko

о, вот что меня смутило! Спасибо!, @YMSmash


0
  1. Убедитесь, что RX вашей платы Arduino подключен к TX GSM, а TX должен быть подключен к RX модуля GSM.
  2. Следующая попытка сделать это
   GPRS.begin(9600);  
   Serial.begin(115200);
  1. Также дважды проверьте проводку. Если у вас есть тестер, вы можете проверить, соединены ли оба конца друг с другом. И в цикле попробуйте напечатать этот Serial.println(GPRS.available()), если он не больше 0, то у вас проблема с соединением.
    #include <SoftwareSerial.h>
    SoftwareSerial sim(2,3); 
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);
      sim.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      while(Serial.available() > 0){
        sim.write(Serial.read());
      }
    
      while(sim.available() > 0){
        Serial.write(sim.read());
      }
    }

ссылка на диаграмму.

Надеюсь, это поможет.

,

зачем вам подключать его к RX/TX Mega и что такое объект «GPRS» в вашем ответе?, @Juraj

Где я взял GPRS? из его кода. ну, на самом деле, просто следуйте моей простой схеме ужина по ссылке ниже, чтобы вы поняли https://imageup.me/images/a49982fe-c592-44d7-b696-ed80e725fec5.png и следуйте моему простому коду, чтобы вы снова поняли. :-) #include <SoftwareSerial.h> Программное обеспечениеSerial sim(2,3); недействительная настройка() { Serial.begin(115200); сим.начать(9600); } недействительный цикл() { в то время как (Serial.available() > 0) { sim.write(Serial.read()); } в то время как (sim.available() > 0) { Serial.write(sim.read()); } }, @homerio

@homerio По вашей ссылке выдается сообщение «К сожалению! При обработке запроса произошло необработанное исключение»., @Nick Gammon

@homerio Комментарии не предназначены для публикации изображений и кода. Пожалуйста, измените свой ответ, чтобы было понятнее., @Nick Gammon

*Перейдите по этой ссылке также для получения справки по диаграммам* — вы можете вставлять изображения в ответы. Это лучше, потому что внешние ссылки могут стать неработающими., @Nick Gammon

Это странно? Я не знаю, как вставить комментарий @Nick :D, но спасибо, чувак :-), @homerio

Вы опубликовали ответ. Вы можете редактировать его. Когда вы это сделаете, появится значок для встраивания изображений., @Nick Gammon

Видел это. Спасибо чувак., @homerio