Как отправить команду AT на sim800l с помощью SoftwareSerial
У меня есть модуль SIM800l, подключенный к Arduino, и я пытаюсь инициализировать его в своей функции настройки с помощью этого кода:
#include <SoftwareSerial.h>
//SIM800 TX подключен к Arduino D8
#define SIM800_TX_PIN 6
//SIM800 RX подключен к Arduino D7
#define SIM800_RX_PIN 7
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
void setup()
{
Serial.begin(38400);
while(!Serial);
serialSIM800.begin(38400);
Serial.println("wait for .... it");
delay(10000);
// комментарии добавлены только для примера, обе команды возвращают мусор
//serialSIM800.write("AT\r\n");
//serialSIM800.write("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n");
Serial.println("команда отправлена");
delay(2500);
Serial.write(serialSIM800.read());
}
Но Serial.write
возвращает мусор.
Когда я использую этот код в цикле:
//Считать вывод SIM800 (если он доступен) и печатайте его в последовательном мониторе Arduino IDE
if(serialSIM800.available()){
Serial.write(serialSIM800.read());
}
//Прочитать входы последовательного монитора Arduino IDE (если они доступны) и отправьте их на SIM800
if(Serial.available()){
serialSIM800.write(Serial.read());
}
и отправляйте AT+SAPBR=3,1,"Contype","GPRS"
или просто AT
команду с последовательным монитором, все работает нормально.
Может ли кто-нибудь помочь с этим?
@onedevteam.com, 👍1
Обсуждение7 ответов
Лучший ответ:
Вы можете попробовать использовать serialSIM800.println("AT") вместо записи. Вот несколько примеров https://github.com/stanleyhuangyc/Freematics/issues/17
NeoSWSerial был бы лучше для этого. Он может читать и писать одновременно, в отличие от SoftwareSerial, и он не отключает прерывания на все время приема символов (~1 мс!). AltSoftSerial был бы еще лучше, но вы можете использовать его только на контактах 8 и 9 (на UNO, другие контакты на других ардуино).
Мой SIM808 возвращает немного мусора с самого начала, так что это может повлиять на ситуацию.
Кроме того, вполне возможно, что вы извлекаете -1 из своего первоначального вызова serialSIM800.read () - это неблокирующий вызов и возвращает -1, когда данные недоступны. Это почти наверняка выглядело бы как мусор.
Где-то ты это говорил ...но серийно.пиши чепуху возврата.... Убедитесь, что последовательная печать является одновременно NL и CR
Вы получаете мусор из-за скорости передачи данных в бодах, установленной как 9600.
Серия.начало(9600); в то время как(!Серийный); serialSIM800.начало(9600); Serial.println("подождите ... это"); delay(10000);
Бесплатное программное обеспечение Atcommander серии Sim800.
http://bayanbox.ir/info/3493267131357723232/ATcenter
IIRC, модемы SIM800 очень популярны, они по умолчанию имеют скорость 9600 бод. Вы получите мусор по цене 38400.
Я успешно использовал SIM800 в 9600.
- SIM800L не отвечает на AT-команды
- GSM SIM900A Содержимое SMS не отображается
- Проблема последовательной связи с общей землей SIM800L
- Как связаться с GPS SIM900a без serial monitor
- AT-команда не отвечает на последовательный монитор
- SIM800L не регистрируется в сети
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
Вы можете разместить свою схему? Вы используете регулировку 4V и транзистор на первом выводе? Может быть [эта библиотека](https://cristiansteib.github.io/Sim800l/) может помочь, @brtiberio
Что за хлам? Скопируйте и вставьте, пожалуйста. Кроме того, запись вывода из чтения без проверки на "доступный", вероятно, вернет "мусор" или, по крайней мере, "ÿ"., @Nick Gammon
Вы читаете только байт, как другие заметили. Кроме того, вы, кажется, посылаете 2 команды, одну сразу за другой. Это может привести к тарабарщине. Хотя было бы неплохо посмотреть, каковы именно ваши "мусорные" результаты., @SoreDakeNoKoto
Я немного удивлен, что вы поставили награду в размере +100 репрезентаций на этот вопрос, но не отвечаете на запросы, подобные комментариям выше, которые могут помочь решить его., @Nick Gammon