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);
}
@YMSmash, 👍1
Обсуждение2 ответа
Лучший ответ:
Не используйте 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
- Убедитесь, что RX вашей платы Arduino подключен к TX GSM, а TX должен быть подключен к RX модуля GSM.
- Следующая попытка сделать это
GPRS.begin(9600);
Serial.begin(115200);
- Также дважды проверьте проводку. Если у вас есть тестер, вы можете проверить, соединены ли оба конца друг с другом. И в цикле попробуйте напечатать этот
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
- Моделирование Arduino Mega 2560 с GSM модулем с использованием Proteus
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Arduino GSM Shield GSM_READY никогда не готов
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Как извлечь широту и долготу из GPS
- Можно ли изменить официальную библиотеку шилдов arduino GSM для работы с аппаратным serial на mega?
- Проблема с отправкой SMS с GSM SIM900
- Как подключить модуль GSM SIM800L?
*когда я набираю любую команду в последовательном мониторе, ничего не происходит* ... у вас нет кода для этого, @jsotola
@jsotola я думал, что он будет автоматически принимать любые AT-команды в последовательном мониторе? в любом случае я добавлю свой код, который я использовал, где я мог отправлять/получать/звонить по телефону, но не читать сообщения, которые я получаю, @YMSmash
arduino ничего не сделает сам... попробуйте этот код... https://www.arduino.cc/en/Tutorial/SoftwareSerialExample, @jsotola
Почему вы используете SoftwareSerial на Mega?!?!, @Majenko