Vypra
Member
AT+SMTPCS?что модуль SIM800 выдает на команду AT+SMTPCS?
+SMTPCS: "ASCII"
OK
AT+SMTPCS?что модуль SIM800 выдает на команду AT+SMTPCS?
void send_Email(String message)
{
//Настройки интернет соединения
sendATCommand("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", true); // задаем команду выхода в интернет
delay (2000); // без паузы не работает
delay (2000);
sendATCommand("AT+SAPBR=3,1,\"APN\",\"internet\"", true); // настройки APN Vodafone
delay (2000); // без паузы не работает
delay (2000);
sendATCommand("AT+SAPBR=1,1", true); // To open a GPRS context. установить GPRS соединение
delay (2000); // без паузы не работает
delay (2000);
//Настройки для отправки e-mail :
sendATCommand("AT+EMAILCID=1", true); // Установка CID параметра для email сессии.
delay (2000);
sendATCommand("AT+EMAILTO=30", true); // Set EMAIL timeout Установка таймаута для SMTP и POP серверов.
delay (2000);
sendATCommand("AT+EMAILSSL=1", true); // Set EMAIL begin encrypt transmission with encrypt port
delay (2000);
sendATCommand("AT+SMTPSRV=\"SMTP.GMAIL.COM\"", true); // Установка адреса и порта SMTP почтового сервера.
delay (2000);
sendATCommand("AT+SMTPAUTH=1,\"*******@gmail.com\",\"****\"", true); // Аутентификация (e-mail адрес, и пароль от e-mail)
delay (2000);
sendATCommand("AT+SMTPFROM=\"*****@gmail.com\",\"*****\"", true); //от кого письмо (почтовый адрес, имя отправителя)
delay (2000);
sendATCommand("AT+SMTPSUB=\"Test\"", true); //тема письма
delay (2000);
sendATCommand("AT+SMTPRCPT=0,0,\"******@gmail.com\",\"******\"", true); // кому письмо (почтовый адрес, имя получателя)
delay (2000);
sendATCommand("AT+SMTPBODY=" + String(message.length()), true); // задаем сколько символов в письме
delay (2000);
sendATCommand(message + "\r\n" + (String)((char)26), true); //После получение ответа от модуля DOWNLOAD. вводим текст письма длиной n символов.
//Для отправки в конце сообщения отправляем символ SUB ( (char)26 или Cntrl+Z)
delay (2000);
delay (2000);
sendATCommand("AT+SMTPSEND", true); // Отправка Email
delay (2000); // без паузы не работает
delay (2000);
delay (2000);
sendATCommand("AT+SAPBR=0,1", true); // разорвать GPRS соединение
}
send_Email("HELLO"); //сообщение
Так и я об этомкласс. вот это вопрос. давайте спроецируем ситуацию. вы пришли в салон за новым авто и опа нежднчик - дворники не работают. дилер вам в ответ - зачем вы решили пользоваться
щетками? вот вам костыль, зацепитесь и дрыгайте, всегда так делаю.
Так и я об этомкласс. вот это вопрос. давайте спроецируем ситуацию. вы пришли в салон за новым авто и опа нежднчик - дворники не работают. дилер вам в ответ - зачем вы решили пользоваться
щетками? вот вам костыль, зацепитесь и дрыгайте, всегда так делаю.
то все будет хорошо.Scenario: UART0 works as data communication interface and UART1 woks as debug port.
Это вы разработчикам Arduino ESP8266 скажите.Если прислушаться к рекомендации производителя...
Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.Это вы разработчикам Arduino ESP8266 скажите.
Тут все просто, у аппаратного UART1 только одна нога Тх на выход.P.S. Кстати SoftSerial использует теже пины - GPIO15 и GPIO13. Ещё один повод чтоб ее не использовать. Зачем второй велосипед, когда уже есть из коробки Serial.swap()?
Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.Это вы разработчикам Arduino ESP8266 скажите.
Тут все просто, у аппаратного UART1 только одна нога Тх на выход.P.S. Кстати SoftSerial использует теже пины - GPIO15 и GPIO13. Ещё один повод чтоб ее не использовать. Зачем второй велосипед, когда уже есть из коробки Serial.swap()?
Serial.swap();
delay (500);
Serial.println("AT+SMTPBODY=" + String(message.length()));
//Serial.println("AT+SMTPBODY=5"); // или так
delay (500);
Serial.println(message + "\r\n" + (String)((char)26));
delay (500); // без паузы не шлет
Serial.swap();
delay (500);
sendATCommand("AT+SMTPSEND", true);
delay (6000);
sendATCommand("AT+SAPBR=0,1", true);
Так и должно быть, вы немножко запутались. Вот правильная логика:DOWNLOAD // !!! но сообщение прилетает после переключения назад на стандартные пины
Не. Посмотрите. В последнем случае, чтоб не переключаться Serial.swap() между SMTPBODY и сообщением, я использовалТак и должно быть, вы немножко запутались. Вот правильная логика:
1. После старта esp8266 serial висит на пинах gpio01 и gpio03.
2. Переключаем на sim800 командой Serial.swap(), подключённый к gpio15 и gpio13
3. На всякий случай чистим буфер serial ( gpio15 и 13), командой Serial.flush();
4. Передаем сообщения sim800 с delay() после каждой передачи.
5. Принимаем сообщение от sim800 ВО ВРЕМЕННУЮ ПЕРЕМЕННУЮ
6. Переключаемся назад на com порт - gpio01 и gpio03 и чистим буфер (gpio01 и 03).
7. Посылаем данные из временной переменной в com порт.
8. Переключемся назад на sim800 и повторяем с п.3
Serial.swap();
delay (500);
Serial.println("AT+SMTPBODY=" + String(message.length()));
//Serial.println("AT+SMTPBODY=5"); // или так
delay (500);
Serial.println(message + "\r\n" + (String)((char)26));
delay (500); // без паузы не шлет
Serial.swap();
delay (500);
sendATCommand("AT+SMTPSEND", true);
delay (6000);
sendATCommand("AT+SAPBR=0,1", true);
Если sim800 дает ответ на каждую команду(подозреваю, что такое должно быть в sim800), то вместо delay() надо дожидаться ответа от sim800, если нет ответа определенное время, надо отправить команду по новой или перегрузить sim800.4. Передаем сообщения sim800 с delay() после каждой передачи.
Вам дали хороший совет, чистить буфер после каждого Serial.swap(), может избавить от неприятных неожиданностей.И Serial.flush(); здесь не использовал
тут все просто уважаемый CodeNameHawk надо переставать давать людям плохие советы аля - чем вам SoftSerial не угодил?Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.
Если UART0 нужен для общения с другим устройством, перебросьте вывод отладочной информации на UART1, что бы не переключаться обратно есть ОТА.
Тут все просто, у аппаратного UART1 только одна нога Тх на выход.
Если вам кажется, что это плохой совет, то хотя бы напишите, чем он плох.тут все просто уважаемый CodeNameHawk надо переставать давать людям плохие советы аля - чем вам SoftSerial не угодил?
Я уже объяснял. Потому что esp8266 arduino из коробки умеет все тоже самое что SoftSerial. Просто надо оторвать 5-ю точку и прочесть документацию на esp8266 arduino. А копипастить корявые примеры из сети конечно легче.Если вам кажется, что это плохой совет, то хотя бы напишите, чем он плох.
После того, как ТС разобрался почему у него не работало, будет все работать и через SoftSerial, если сделать без ошибок.
Плюсы от этого очевидные, программа надежней, легче читается и как следствие этого у вас не разнесет мозг.
Вы ещё не поняли откуда у вас появлялись китайские иероглифы в письме? Это как раз куски отладочной информации esp8266 из буфера.чистить буфер после каждого Serial.swap(), может избавить от неприятных неожиданностей.
Вышло не понимание, ТС и использовал библиотеку, что идет с иде, просто в версии 2,5,2 она у него перестала работать.Я уже объяснял. Потому что esp8266 arduino из коробки умеет все тоже самое что SoftSerial.
#include <SoftwareSerial.h> // GSM sim800L
- // БИБЛИОТЕКИ
вот здесь вы переключаетесь на SIM800 (gpio15 и gpio13) и передаете размер письма и тело письма. пока все логично
а дальше у меня взорвался мозг. вы переключаетесь на обычный COM порт (gpio01 и gpio03) и шлете в него команды SIM800 для завершения передачи письмаКод:Serial.swap(); delay (500); Serial.println("AT+SMTPBODY=" + String(message.length())); //Serial.println("AT+SMTPBODY=5"); // или так delay (500); Serial.println(message + "\r\n" + (String)((char)26)); delay (500); // без паузы не шлет
ВОПРОС - как SIM800 их получит если команды вы шлете на gpio01 и gpio03, а SIM800 подключен к gpio15 и gpio13?Код:Serial.swap(); delay (500); sendATCommand("AT+SMTPSEND", true); delay (6000); sendATCommand("AT+SAPBR=0,1", true);
// ОСНОВНОЙ ЦИКЛ
// Мы на GPIO 1, 3
Serial.swap(); // Переключаемся на GPIO 13, 15
delay (500);
Serial.println("AT+SMTPBODY=" + String(message.length())); // создаем тело сообщения
delay (500);
Serial.println(message + "\r\n" + (String)((char)26)); // вводим текст сообщения. Мы еще на GPIO 13, 15
delay (500);
Serial.swap(); // Переключаемся на GPIO 1, 3
delay (500);
// Мы на GPIO 1, 3
sendATCommand("AT+SMTPSEND", true); // Переходим в sendATCommand
// ВНЕШНЯЯ ФУНКЦИЯ
String sendATCommand(String cmd, bool waiting)
{
// Мы на GPIO 1, 3
Serial.println(cmd); // Пишем команду в монитор порта ПК для себя, чтоб видеть что будем посылать СИМ800. Но мы на GPIO 1, 3.
delay (300);
Serial.swap(); // Переключаемся на GPIO 13, 15
Serial.flush();
delay (300);
String _resp = "";
Serial.println(cmd); // Даем команду SIM800. Мы пока на GPIO 13, 15
if (waiting)
{
_resp = waitResponse(); // Если нужно ждать, идем в String waitResponse(). Мы пока на GPIO 13, 15.
}
else
{
Serial.swap(); // Если не нужно ждать, мы переключимся на на GPIO 1, 3, и выйдем в основной цикл, чтоб начать все сначала.
Serial.flush();
delay (300);
}
return _resp;
}
//***************************************************************************************************************
String waitResponse()
{
// Мы пока на GPIO 13, 15
String _resp = "";
unsigned long _timeout = millis() + 4000;
do
{ delay(0);
if (millis() > _timeout )
{
Serial.swap(); // Если СИМ800 не отвечает (ошибка), мы переключаемся на на GPIO 1, 3, печатаем себе Timeout... и уходим в основной цикл.
Serial.flush();
delay (300);
Serial.println("Timeout...");
break;
}
if (Serial.available())
{
_resp = Serial.readString();
_response = _resp;
Serial.swap(); // Если СИМ800 ответила, мы переключаемся на GPIO 1, 3, печатаем себе ответ СИМ800 и выйдем в основной цикл, чтоб начать все сначала.
Serial.flush();
delay (300);
Serial.println(_resp);
break;
}
}
while (1) ;
return _resp;
}