Все о SIM800L и все что с ним связано.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

  if (Serial.available()) br = Serial.read();
  if (br) {/ запись байта в буфер
    resp_buf[pos_buf] = br; // записали
    ++pos_buf; // увеличили счетчик
    if (pos_buf >= max_size_response_buf) pos_buf = 0; // если дошло до максимума - обнуляем
  }

где то я косячу...

void loop() {
  while (1) {
    wdt_reset();

    if (Serial.available())MODEM.write(Serial.read());




    if (MODEM.available() > 0) {

      if (MODEM.available())temp = MODEM.read();
        buffers[pos_buf] = temp;
        pos_buf++;
        if (pos_buf >= MAX_SIZE_RESP_BUF) pos_buf = 0;
 


      Serial.print("Polucheno: ");
      Serial.print(pos_buf);
      Serial.print(" Byte");
      Serial.println("");
      Serial.println(buffers);


      for (byte i = 0; i < pos_buf ; i++)buffers[i] = NULL;
      pos_buf  = 0;


    }//if (MODEM.available() > 0) {
    }//while (1) {
    }//loop

 

nik182
Offline
Зарегистрирован: 04.05.2015

Вопрос чуть в сторону. Какой тариф, какого оператора сейчас выгоден и работает с 800l в МО?  

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Может я что-то не так понимаю в работе порта...

void loop() {
  while (1) {
    wdt_reset();
    if (Serial.available())MODEM.write(Serial.read());


    if (MODEM.available() > 0) {//Если модем что-то отправил в порт
      delay(50);
byte a = MODEM.available();//Получаем количество байт, которые модем отправил в порт

//в цикле заношу все полученные байты в массив
      for (byte i = 0; i < a; i++)
      {
        byte temp = MODEM.read();
        buffers[pos_buf] = temp;
        pos_buf++;
      }



      for (byte i = 0; i < pos_buf ; i++) {
        if (buffers[i] == '\r')buffers[i] = 'r';
        if (buffers[i] == '\n')buffers[i] = 'n';
      }

      Serial.print("Polucheno: ");
      Serial.print(pos_buf);
      Serial.print(" Byte");
      Serial.println("");


      //Serial.println(buffers);
      for (byte i = 0; i < pos_buf ; i++) {
        Serial.println(buffers[i]);
      }

      for (byte i = 0; i < pos_buf ; i++)buffers[i] = NULL;
      pos_buf  = 0;

    }//if (MODEM.available() > 0) {



  }//while (1) {
}//loop

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

К примеру, на АТ модем отвечает

Polucheno: 9 Byte
a
t
r
r
n
O
K
r
n
всё верно, 9 байт, без задержки выдает всякую ерунду
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1 проход loop = 1 прочитанный байт от модема
Если байт не равен нулю - работаем
Выводим его в монитор (write) и заносим в буфер
Если упёрлись в размер буфера - очищаем буфер
Если пришло \n и в буфере больше одного байта - смотрим предыдущий , если он \r - закончилась строка - ищем в ней нужные подстроки
Очищаем буфер, работаем дальше.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ну а DTMF куда уж проще, нашли ring значит прилетел звонок, смотрим телефонный номер, если разрешенный - возводим флаг управления.
Далее в строках высматривает нажатые кнопки, параллельно высматривает команду прекращения звонка.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
void ModemReads() {
  if (MODEM.available())temp = MODEM.read();
  if (temp) {
    buffers[pos_buf] = temp;
    pos_buf++;
    if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r') {
      NewLine = true;
    }
  }
}

void loop() {
  while (1) {
    wdt_reset();
    if (Serial.available())MODEM.write(Serial.read());
    ModemReads();

    if (NewLine) {
      NewLine = false;
      if (strstr (buffers, "+CCALR: 1") != NULL)
      {
        Serial.println("Set'_OK");
      }

    
            for (byte i = 0; i < pos_buf ; i++) {
              if (buffers[i] == '\r')buffers[i] = 'r';
              if (buffers[i] == '\n')buffers[i] = 'n';
            }
      Serial.println(buffers);
      for (byte i = 0; i < pos_buf ; i++)buffers[i] = NULL;
      pos_buf = 0;
    }


  }//while (1) {
}//loop

Как-то так?)

Почему в монитор порта постоянно отправляется символ n

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Не, все не так,много лишнего,от while не избавились, зачем менять \n на n, логика вообще не как я написал, зачем лишняя функция чтения если все в одно условие можно запихнуть. Смотрите пример в теме Снова mqtt там все готовое уже есть, правда обработка побайтная, но к вашему буферу прикрутить можно.

вот пример только круговой буфер

  if (modemAvailable()) { // если что то пришло из модема
    br = modemRead(); // читаем пришедший байт
    if (br) { // если он больше нуля
      if (posModemBuf >= maxSizeRespBuf) posModemBuf = 0; respBufModem[posModemBuf] = br; ++posModemBuf; // добавляем пришедший байт в круговой буфер
#ifdef SHOW_LOG
      if ((br == '\r') || (br == '\n') || ((br >= ' ') && (br < 0x7F))) { // если символ печатный или конец строки
        logWrite(br); // выводим его в лог
      } else { // если не печатный
        logHexPrint(br); logWrite(' '); // выводим его шестнадцатиричное представление в лог
      }
#endif
//-------------здесь пишем что то свое обрабатываем содержимое буфера --- добавляем условие что конец строки, те пришло \r\n
//-------------если обработка прошла успешно чистим буфер
memset(respBufModem,0,maxSizeRespBuf);
//-------------закончили работу с данными от модема
    }
  }

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Irinka пишет:

Цитата:
быстродействия не хватает, только отправляемые команды там храню.

Спасибо. Учту. 

На счёт примеров, как будет время, ткните, пожалуйста, хочу знать.

функция, возвращающая указатель на строку

char * getAPNname(byte inCard) {
  static char outStr[maxSizeBrokerID];
  if (inCard) { // карта из списка
    strcpy(outStr, gprsAPNnames[inCard - 1]); // берем из списка в буфер
  } else { // выдаем дефолтный APN
    byte i = 0; while (gprsAPNnames[i][0] != '0') ++i; // цикл по всем APN
    strcpy(outStr, gprsAPNnames[i - 1]); // берем предпоследний в буфер
  }
  return outStr;
}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

andycat пишет:
от while не избавились

Я всё думала от какого while я не избавилась...

Об этом я прочитала в статье про тюнинг ардуино ....

http://codius.ru/articles/Тюнинг_Arduino_или_ускоряем_работу_платы

andycat пишет:
зачем менять \n на n

Это я для себя делала, смотрела что приходит от модема посимвольно.

С кодом разбираюсь)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
Если я хочу обрабатывать каждую новую строку от модема (т.е. текст до переноса строки), то примерно так?
char buffers[50];
byte pos_buf;
#define MAX_SIZE_RESP_BUF 50
bool NewLine = false;
bool logs = false;
bool newline = false;

bool k1 = false;
bool k2 = false;
bool k3 = false;

void loop() {

  wdt_reset();
  if (Serial.available())MODEM.write(Serial.read());



  if (MODEM.available()) {//если что-то пришло с модема
    byte temp = MODEM.read();//читаю 1 байт
    if (temp) {//если считанный байт больше 0
      //if (pos_buf >= MAX_SIZE_RESP_BUF) pos_buf = 0;//буфер не круговой
      buffers[pos_buf] = temp;//добавляю считанный байт в буфер
      pos_buf++;//уведичиваю позицию в массиве буфера

      //Печать в монитор порта полученных байт
      if (logs) {
        if ((temp == '\r') || (temp == '\n') || ((temp >= ' ') && (temp < 0x7F))) {
          Serial.write(temp);
        } else {
          Serial.println(temp, HEX);
        }
      }
      //Печать в монитор порта полученных байт

      if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r') {//если конец строки(пришло \r\n)
        /*  Serial.print("Polucheno: ");
          Serial.print(pos_buf);
          Serial.print(" Byte");
          Serial.println("");
          Serial.println(buffers);*/
        //Проверка ответа от модема (ответ на АТ)
        if (strstr (buffers, "AT\r") != NULL)k1 = true;
        if (strstr (buffers, "OK") != NULL && k1) {
          k1 = false;
          Serial.println("Uart_OK");
        }
        //Проверка сети(ответ на AT+CCALR?)
        if (strstr (buffers, "AT+CCALR?") != NULL)k2 = true;
        if (strstr (buffers, "+CCALR: 1") != NULL && k2)k3 = true;
        if (strstr (buffers, "OK") != NULL && k2 && k3) {
          Serial.println("Set'_OK");
          k2 = false;
          k3 = false;
        }

        memset(buffers, 0, pos_buf);
        pos_buf = 0;
      }

    }//if (temp)
  }//if (MODEM.available()
}//loop

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Не нашел проверку на переполнение буфера после ++pos, соответственно и очистка в 57 строке может вылезти за границы памяти
В остальном движение правильное

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Да-да, я немного не поняла, когда я заполняла буфер в цикле while, как только буфер наполнялся до максимума, я выходила из while, обрабатывала буфер и очищала его

      while (MODEM.available()) {
        if (pos_buf < MAX_SIZE_RESP_BUF) {
          byte temp = MODEM.read();
          buffers[pos_buf] = temp;
          pos_buf++;
        } else {
          Serial.println("Bufer perepolnen");
          break;
        }
      }

А сейчас, просто если буфер переполнен прекратить наполнение? а если не придёт конец строки то буфер будет заполнен и очистка не произойдёт?

  if (MODEM.available()) {//если что-то пришло с модема
    byte temp = MODEM.read();//читаю 1 байт
    if (temp) {//если считанный байт больше 0
      if (pos_buf<MAX_SIZE_RESP_BUF){
???
}


       buffes[pos_buf] = temp;//добавляю считанный байт в буфер
pos_buf++;//уведичиваю позицию в массиве буфера

}
 

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Так?

void loop() {
  wdt_reset();
  if (Serial.available())MODEM.write(Serial.read());

  if (MODEM.available()) {
    byte temp = MODEM.read();
    if (temp) {

      buffers[pos_buf] = temp;
      pos_buf++;


      if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r' || pos_buf>=MAX_SIZE_RESP_BUF) {//если конец строки(пришло \r\n)
        //или буфер переполнен

//работаю со строкой

        memset(buffers, 0, pos_buf);
        pos_buf = 0;
      }

    }//if (temp)
  }//if (MODEM.available()
}//loop

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ну не, обрабатывать строку / буфер когда придет конец строки. Сразу после обработки данных всегда в любом случае буфер чистить, т к данные в нём уже не нужны. А за размером буфера следить банально потому что при превышении МК зависнет. Т е по факту это две параллельные задачи, обработка сама по себе, контроль размера сам по себе. При превышении тупо pos в ноль и чистим буфер. Да, мы потеряем данные, но пока так научитесь, на след шаге будете круговой буфер использовать.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Irinka, а вы а школе/вузе информатику учили ?)
Рекомендую нарисовать все на бумаге ромбиками и квадратиками - сильно поможет в понимании.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Информатика в школе была, и в колледже была (мне 27 лет, Иринкой звать:) ) рисовали в паинте, печатали в ворде, работали в экселе, всё)

Итак:

void loop() {

  wdt_reset();
  if (Serial.available())MODEM.write(Serial.read());

  if (MODEM.available()) {
    byte temp = MODEM.read();
    if (temp) {

      if (pos_buf >= MAX_SIZE_RESP_BUF) {
        memset(buffers, 0, MAX_SIZE_RESP_BUF);
        pos_buf = 0;
      }

      buffers[pos_buf] = temp;
      pos_buf++;

      if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r') {
        Serial.print("Polucheno: ");
        Serial.print(pos_buf);
        Serial.print(" Byte");
        Serial.println("");
        Serial.println(buffers);

        //работаю с полученной строкой

        memset(buffers, 0, pos_buf);
        pos_buf = 0;
      }
    }//if (temp)
  }//if (MODEM.available()
}//loop

Если модем отправил какие-то данные

Считываем 1 байт

Если байт не равен 0, записываем его в буфер

Если размер буфера становится больше MAX_SIZE_RESP_BUF то очищаю буфер и начинаю заполнения с 0 позиции

Но тогда я теряю данные? Правильно?

Дальше, если буфер не переполнен

Если приходит перенос строки, работаю с накопившемся буфером, и очищаю буфер.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

При превышении нет смысла дальше обрабатывать , соответственно все что ниже 13 строки засунуть в else и в фигурные скобки соответственно

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Но я б проверку на переполнение сразу после ++ сделал и поставил бы после обработки это увеличение

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
void loop() {

  wdt_reset();
  if (Serial.available())MODEM.write(Serial.read());

  if (MODEM.available()) {
    byte temp = MODEM.read();
    if (temp) {
      buffers[pos_buf] = temp;
      pos_buf++;
      
      if (pos_buf >= MAX_SIZE_RESP_BUF) {
        memset(buffers, 0, MAX_SIZE_RESP_BUF);
        pos_buf = 0;
      } else {

        if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r') {
          Serial.print("Polucheno: ");
          Serial.print(pos_buf);
          Serial.print(" Byte");
          Serial.println("");
          Serial.println(buffers);

          //работаю с полученной строкой

          memset(buffers, 0, pos_buf);
          pos_buf = 0;
        }
      }//if (pos_buf >= MAX_SIZE_RESP_BUF) {
    }//if (temp)


  }//if (MODEM.available()
}//loop

 

andycat пишет:
Но я б проверку на переполнение сразу после ++ сделал и поставил бы после обработки это увеличение

Вы имеете ввиду pos_buf++ с 10 строчки на 29?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Да, но кроме этой строчки ещё и проверку на переполнение перетащить вниз, иначе может произойти ситуация что конец строки попадет на последние ячейки буфера, но 5е обработается.

Впрочем оставьте как есть, должно работать ок при не сильном потоке данных

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

если буфер переполняется, то данные теряются, так как буфер очищаю, а с другой стороны, у меня нет таких больших ответов от модема, размером больше 50 байт (MAX_SIZE_RESP_BUF)

Правильно понимаю?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Правильно, только жизнь сложнее чем теория и вместе с ответами могут прилетать например длинные рекламные СМС и вы легко потеряете важную информацию, но пока об этом не думайте, с опытом все перепишите или возьмите готовое пару страниц назад в этой ветке.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

По коду выше 

void loop() {

  wdt_reset();
  if (Serial.available())MODEM.write(Serial.read());

  if (MODEM.available()) {
    byte temp = MODEM.read();
    if (temp) {
      buffers[pos_buf] = temp;
      pos_buf++;
      
      if (pos_buf >= MAX_SIZE_RESP_BUF) {
        memset(buffers, 0, MAX_SIZE_RESP_BUF);
        pos_buf = 0;
      } else {

        if (temp == '\n' && pos_buf > 1 && buffers[pos_buf - 2] == '\r') {
          Serial.print("Polucheno: ");
          Serial.print(pos_buf);
          Serial.print(" Byte");
          Serial.println("");
          Serial.println(buffers);

          //работаю с полученной строкой

          memset(buffers, 0, pos_buf);
          pos_buf = 0;
        }
      }//if (pos_buf >= MAX_SIZE_RESP_BUF) {
    }//if (temp)


  }//if (MODEM.available()
}//loop

Строка 26

 memset(buffers, 0, pos_buf); или лучше чистить весь буфер memset(buffers, 0, MAX_SIZE_RESP_BUF);

 

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

andycat пишет:
с опытом все перепишите или возьмите готовое пару страниц назад в этой ветке.

Я лучше с опытом) а Ваш код часто просматриваю, изучаю, спасибо что помогаете.

С использованием char всё работает намного быстрее. )

nhs
Offline
Зарегистрирован: 28.07.2019

У меня почему-то не отключаются мыло-оповещения про этот топик, а я аккуратный, читаю все входящие мылы. Поставьте же уже задачу, я напишу может, по-быстрому, что требуется, и закроем тему ?

Ну и вообще красивый вариант решения любой проблемы - создавать отдельную тему и там уже обсуждать проблему сообразно названию темы. А какое отношение имеет, например "pos_buf++ с 10 строчки на 29", к SIM800L ?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

del

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
nhs, Вы правы.
Я прошу администрацию форума, если это возможно, перенести все сообщения, начиная с #179 в отдельную тему "Чтение порта в char" раздела "Песочница. Раздел для новичков" 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

nhs, анекдот есть в тему ".....всех удовлетворяет а его нет...."
Может быть читать быстрее необходимо или все уведомления тупо в почте настроить через правила ? И проблема исчезнет....

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

andykat, у Вас нет задержки после 2 строки, и всё работает?

void loadDataFromModem() {
  if (gsm.available()) {
    while (gsm.available()) {
      byte readByte = gsm.read();
      if (readByte > 0) {
#if (USE_UART_LOG == 1)
        Serial.write(readByte);
        /*if ((readByte < 0x20) || (readByte >= 0x7F)) {
          Serial.print(" 0x"); Serial.print(readByte, HEX); Serial.print(" ");
          } else {
          Serial.write(readByte);
          }*/
#endif
        resp_buf[pos_buf] = readByte;
        ++pos_buf;
        if (pos_buf >= maxSizeResponse) pos_buf = 0;
        wdt_reset();
        if (doCmdForModem(readByte) == 1) break;
      }
    }
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

у меня вообще нигде delay нет и вам советую
и все работает

Update: вру, есть delay, но в не критичных секциях, типа ожидание модема при перезагрузке.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Irinka , в вашем коде

http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...

основная проблема в выводе всяких сообщений в процессе работы с модемом Polecheno и прочее.
возьмите как аксиому: ни при каких обстоятельствах при чтении данных из модема не задерживать поток.
максимально что можно это с помощью serial.write вывести приходящий байт.
если уж очень хочеться то только при отрицательном условии modem.available().
в любом случае, когда железку доделаете и она будет работать удалите (или define отключите) все диагностические сообщения software serial как страшный сон, включая саму include и инициализацию библиотеки.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Я отладку делаю вот так:

//Отладка
#define DEBUG
#ifdef DEBUG
#define SERIAL_BEGIN         Serial.begin(19200)
#define DEBUG_PRINT(x)       Serial.print (x)
#define DEBUG_PRINTLN(x)     Serial.println (x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#define SERIAL_BEGIN
#endif
//Отладка

Буду удалять и этот код.

 

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

В ответ на команду AT+CCALR? я получаю три строки:

AT+CCALR?
+CCALR: 1
OK
 
byte BAT_SET = 0x00;
          if (strstr (buffers, "AT+CCALR?") != NULL)bitSet(BAT_SET, 0);
          if (strstr (buffers, "+CCALR: 1") != NULL) {
            if (bitRead(BAT_SET, 0)) {
              bitSet(BAT_SET, 1);
            } else {
              BAT_SET = 0x00;
            }
          }
          if (strstr (buffers, "OK") != NULL) {
            if (bitRead(BAT_SET, 0) && bitRead(BAT_SET, 1)) {
              Serial.println("Set'_OK");
              BAT_SET = 0x00;
            } else {
              BAT_SET = 0x00;
            }
          }

Не нравится мне мой код, как сделать правильнее?

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Масса путей, самый правильный наверное писать классы под команды, и каждому классу прописывать требуемые ответы. Поскольку я с ООП не дружу, у меня под каждую команду выбирается свой case и ожидается нужный ответ. Выбирайте не по принципу нравится\нет а работает\нет, потом с опытом будете красоту наводить.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

С case так?

          switch (BAT_SET) {
            case 0:
              if (strstr (buffers, "AT+CCALR?") != NULL)BAT_SET = 1;
              break;

            case 1:
              if (strstr (buffers, "+CCALR: 1") != NULL) BAT_SET = 2;
              break;

            case 2:
              if (strstr (buffers, "OK") != NULL){;
              Serial.println("Set'_OK");
              BAT_SET = 0;
              }
              break;
          }

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Да,. Только добавить таймеры, условия чтоб если на х миллисекунд нет правильного ответа значит проблема, искать строки заново или модем перезагружать. В примерах все есть :)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
          switch (BAT_SET) {
            case 0:
              if (strstr (buffers, "AT+CCALR?") != NULL)BAT_SET = 1;
              break;
            case 1:
              if (strstr (buffers, "+CCALR: 1") != NULL) BAT_SET = 2;
              break;
            case 2:
              if (strstr (buffers, "OK") != NULL){
              Serial.println("Set'_OK");
              BAT_SET = 0;
              }
              break;
          }

Хотя нет, неверно

BAT_SET = 0 получила я от модема AT+CCALR? значит BAT_SET = 1
BAT_SET = 1 получила я от модема +CCALR: 0, условие не соблюдается, а BAT_SET = 1, значит следующую команду AT+CCALR? я не обработаю

Только если таймером ответа сбросить BAT_SET в 0

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Ещё вопросик, я создала функцию для чтения из модема

void sim800reads() {
  if (MODEM.available()) {
    byte temp = MODEM.read();
    if (temp) {
      buffers[pos_buf] = temp;
      pos_buf++;
      if (pos_buf >= MAX_SIZE_RESP_BUF - 1) {
        buffersclear();.................................................

 

А в loop просто её вызываю.

Не влияет на быстродействие?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

На быстродействие все влияет, пробуйте, будут проблемы - будете оптимизировать.

Chenod
Offline
Зарегистрирован: 15.09.2015

Помогите! Купил SIM800L, подключил к usb-uart к компу, работал в terminal 1,9. К модулю припаял стандартную антенну. Модуль настроил, несмотря на периодические отвалы питания (на делителе от 5 В) модуль в 80-90% выдает адекватные ответы. Однако модуль не регистрируется в сети, хоть и видит эти сети (МТС, Билайн, Мегафон), проверял AT+CCID, результат положительный, что говорит о том, что симка коннектится. Перепрошил модуль на 3 версии вверх с дров производителя. AT+CREG? выдает 0,2; мне непонятно какова причина "2". AT+CSQ выдает иногда 0,0, иногда 28,0, подключал на аппаратной антенне, на дополнительной, на обоих сразу. Менял симку с ТЕЛЕ2 на МТС, в AT+CREG? появилось еще и 0,4, что не добавило понимания. Подскажите, что делать? Вангуя, что будет ответ про смену/запайку питания: проверял его кучу раз, запитывал как от делителя, так и от БП, т.к. интересует только отправка СМС потребление будет небольшое, поэтому делитель.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

2 ампера с делителя ?

Chenod
Offline
Зарегистрирован: 15.09.2015

Потребление 50-70 мА, откуда 2А? Если я все правильно понимаю, сила тока скачет при интернет подключении. Команда проверки питания выдает 3,82 В, если вам интересно

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

По даташиту пиковый ток 2А.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Да, при регистрации именно самые пики питания.

Chenod
Offline
Зарегистрирован: 15.09.2015

Итак, господа:

1. Пиков в 2 ампера я не заметил на всем промежутки работы модуля (10 минут)

2. Стандартный ток в модуле - 20 мА

3. При регистрации в сети ток - 100мА, никакими 2А там и не пахнет.

3. Как я и говорил проблема не в питании, сейчас обеспечил абсолютно стабильные 4В 2А, результат нулевой. Прошу если и высказываться, то конструктивно, имхо даже с студенту 1-2 курса понятно что при нагрузках в виде регистрации в сети и отправки 3-4 сообщений по юарту в секунду модуль не сможет физически жрать 2А.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чем проводились измерения?

Feofan
Offline
Зарегистрирован: 28.05.2017
Chenod
Offline
Зарегистрирован: 15.09.2015

БП ELEMENT 1502DD

MaksVV
Offline
Зарегистрирован: 06.08.2015

Фотку подключения к БП киньте, а то вдруг дюпонты