Как отправить команду 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 команду с последовательным монитором, все работает нормально.

Может ли кто-нибудь помочь с этим?

, 👍1

Обсуждение

Вы можете разместить свою схему? Вы используете регулировку 4V и транзистор на первом выводе? Может быть [эта библиотека](https://cristiansteib.github.io/Sim800l/) может помочь, @brtiberio

Что за хлам? Скопируйте и вставьте, пожалуйста. Кроме того, запись вывода из чтения без проверки на "доступный", вероятно, вернет "мусор" или, по крайней мере, "ÿ"., @Nick Gammon

Вы читаете только байт, как другие заметили. Кроме того, вы, кажется, посылаете 2 команды, одну сразу за другой. Это может привести к тарабарщине. Хотя было бы неплохо посмотреть, каковы именно ваши "мусорные" результаты., @SoreDakeNoKoto

Я немного удивлен, что вы поставили награду в размере +100 репрезентаций на этот вопрос, но не отвечаете на запросы, подобные комментариям выше, которые могут помочь решить его., @Nick Gammon


7 ответов


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

0

Вы можете попробовать использовать serialSIM800.println("AT") вместо записи. Вот несколько примеров https://github.com/stanleyhuangyc/Freematics/issues/17

,

1

NeoSWSerial был бы лучше для этого. Он может читать и писать одновременно, в отличие от SoftwareSerial, и он не отключает прерывания на все время приема символов (~1 мс!). AltSoftSerial был бы еще лучше, но вы можете использовать его только на контактах 8 и 9 (на UNO, другие контакты на других ардуино).

,

0

Мой SIM808 возвращает немного мусора с самого начала, так что это может повлиять на ситуацию.

Кроме того, вполне возможно, что вы извлекаете -1 из своего первоначального вызова serialSIM800.read () - это неблокирующий вызов и возвращает -1, когда данные недоступны. Это почти наверняка выглядело бы как мусор.

,

1

Где-то ты это говорил ...но серийно.пиши чепуху возврата.... Убедитесь, что последовательная печать является одновременно NL и CR

,

1

Вы получаете мусор из-за скорости передачи данных в бодах, установленной как 9600.

Серия.начало(9600); в то время как(!Серийный); serialSIM800.начало(9600); Serial.println("подождите ... это"); delay(10000);

,

0

Бесплатное программное обеспечение Atcommander серии Sim800.

http://bayanbox.ir/info/3493267131357723232/ATcenter

,

1

IIRC, модемы SIM800 очень популярны, они по умолчанию имеют скорость 9600 бод. Вы получите мусор по цене 38400.

Я успешно использовал SIM800 в 9600.

,