Несколько запутанный серийный номер с SIM800L и Uno R3

Я успешно обмениваюсь данными с SIM800L с моего UNOR3, за исключением некоторых ошибок. Но самая большая проблема связана с последовательным монитором.

Ответы от SIM800L несколько запутаны, поскольку некоторые символы случайным образом ошибочны. См. фрагмент ниже:

Initializing...

OK

+C⸮T'⸮⸮b⸮j


OK

88l4110068165694746f

O⸮

+CQEG:Y⸮⸮H⸮⸮*⸮⸮C⸮
ERROR
⸮> H⸮⸮*⸮⸮
F⸮ROR
H⸮⸮
ERRO
H⸮⸮*⸮⸮

Мой код также ниже.

#include <SoftwareSerial.h>

//Создать серийный объект программного обеспечения для связи с SIM800L
SoftwareSerial mySerial(11,10); //SIM800L Tx & Rx подключен к Arduino #3 & #2

void setup()
{

  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  // Начать последовательную связь с Arduino и Arduino IDE (последовательный монитор)
  Serial.begin(115200);

  //Начнем последовательную связь с Arduino и SIM800L
  mySerial.begin(115200);

  Serial.println("Initializing...");
  delay(1000);

  mySerial.println("AT"); // Как только тест рукопожатия будет успешным, он вернется к OK
  updateSerial();
  mySerial.println("AT+CSQ"); //Тест качества сигнала, диапазон значений 0-31, 31 — лучший
  updateSerial();
  mySerial.println("AT+CCID"); //Прочитайте информацию о SIM-карте, чтобы убедиться, что SIM-карта подключена
  updateSerial();
  mySerial.println("AT+CREG?"); //Проверяем, зарегистрировался ли он в сети
  updateSerial();
  mySerial.println("AT+CMGF=1"); // Настройка режима ТЕКСТ
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0"); // Решает, как следует обрабатывать вновь прибывшие SMS-сообщения
  updateSerial();
  mySerial.println("AT+CMGS=\"+447518103652\"");//изменить ZZ с кодом страны и xxxxxxxxxxx с номером телефона на смс
  updateSerial();
  mySerial.print("System on!"); //текстовое содержимое
  updateSerial();
  mySerial.write(26);

  delay(1000);
}


int milli = millis();
void loop()
{
  if (digitalRead(2) == HIGH) {
    digitalWrite(3, HIGH);
  mySerial.println("AT+CMGS=\"+447518103652\"");//изменить ZZ с кодом страны и xxxxxxxxxxx с номером телефона на смс
  updateSerial();
  mySerial.print("Button Pressed!"); //текстовое содержимое
  updateSerial();
  mySerial.write(26);
  } else {
    digitalWrite(3, LOW);
  }

  if (milli <= millis() - 500) {
    updateSerial();
    milli = millis();
  }
}

void updateSerial()
{
  // задержка (300);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Пересылаем то, что Software Serial получил в последовательный порт
  }
}

SIM800L питается от отдельного источника питания с развязывающим конденсатором 100n, а заземление является общим.

, 👍-1

Обсуждение

Какую плату SIM800L вы используете? Какая проводка и длина провода между uno и модулем? Есть ли у вас сдвиг уровня для возможно необходимого преобразования 3,3 В <-> 5 В?, @Maximilian Gerhardt

Это основная плата, одна перемычка и внутренние соединения макетной платы. Я не знаю, что вы имеете в виду, если только вы не имеете в виду понижение последовательного напряжения, что не помогло., @James Conway

У вас есть ссылка на плату SIM800L, которую вы используете?, @Maximilian Gerhardt

Я не знаю, но это выглядит так -GPRS-Module-Board-MicroSIM-Transfer-Card-Core-Board-Quad-band-p-1086519.html&psig=AOvVaw0LLO-qboau_2vsBH7ne9uo&ust=1574023590691357, @James Conway

Итак, какое напряжение вы подаете в качестве VCC и какую схему смещения уровня вы используете? Это просто голый модуль с конденсатором, его нужно напрямую запитать необходимым напряжением от 3,4 до 4,2В и нужен как минимум сдвиг уровня от 5В до целевого VCC., @Maximilian Gerhardt

От моего внешнего блока питания требуется 3,8 В., @James Conway


1 ответ


1

Вот хорошая документация: https://lastminuteengineers.com/sim800l-gsm-module-arduino- учебник/ --

Добавили ли вы делитель напряжения к контакту RX? Если Arduino подаст 5 вольт на контакт модуля, модуль может быть разрушен.

Модуль имеет автоматическое определение скорости передачи, поэтому 115 200 бод должно быть в порядке. Вы настроили свой терминал на 115200 бод для последовательной связи?

Во время отправки Software Serial отключает все прерывания, чтобы микрочасы были более точными. Это может исказить прерывание таймера для аппаратного последовательного порта (но я действительно не знаю, нужен ли он).

Вы изменили контакты 2 и 3 для прогрмаммного последовательного порта (как в примере) на SoftwareSerial mySerial(11,10); Вы добавили соединения к нужным контактам. (RX?? <--> TX??)?

И последнее, но не менее важное. Пример использует скорость 9600 бод для обоих последовательных интерфейсов. Возможно ваше решение 115200 слишком высокое.

,

Я изначально следовал этому, поэтому попытался изменить контакты и скорость передачи данных, что помогло, потому что с 9600 чип не реагировал, а с делителем напряжения из этого руководства у меня была такая же проблема., @James Conway

@JamesConway Пожалуйста, проверьте, подключили ли вы контакт 11 Arduino к контакту TX модуля и контакт 10 к контакту RX модуля. И проверьте, установили ли вы последовательный терминал в идентификаторе Arduino на 115200 бод, так как вы настроили аппаратный последовательный порт также на 115200 бод. Глядя на последовательный вывод, я бы сказал, что у вас проблемы с подключением uno к ПК. Так что дело в бодах наиболее вероятно., @Peter Paul Kiefer