Алгоритм настройки модуля SIM800L

не все версии прошивки sim800l корректно это отрабатывают (длительность DTMF) так что так себе идея.

Спасибо.
Я, кстати, обновила прошивку на

SIM800L24_BOOTLOADER_V005_MT6261_1418B05SIM800L24
const char at0cmdAT[] PROGMEM =      "AT\r"; // проверка связи

А почему вы храните символ \r?

а почему нет? :slight_smile:
команда для модема должна заканчиваться \r

gsm.print(cmd_buf);
можно же?
gsm.println(cmd_buf);

И ещё

  char cmd_buf[max_size_cmd_buf]; // буфер команд
  s800lib::clearRespBuf(); // очищаем приемный буфер
  const char * addrStroki = pgm_read_word_near((int)(at_list_cmd + _current_cmd)); 
strcpy_P(cmd_buf, addrStroki);

Адрес команды, это тоже самое что по ссылке ниже?

https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));

И ещё

Спойлер

if (s800lib::findResp(( char *) "CMGL:" , inByte))

Для чего указывать *(char)**CMGL

можно, но
1 привычка, поскольку не всегда командой print отправляю, можно же просто пробежаться по массиву char и отправить gsm.write(byte)
2 есть составные команды/длинные, после отправки которых еще куча данных отправить и только потом \r. Т е чтоб не ломать логику и голову, проще сразу в команду где надо добавить завершающий символ.
3 переносимость, в stm32 никаких serial и prinln нет, все ручками писать приходиться.

а уберите и посмотрите warning компилятора :slight_smile:

Поняла. Нужно. :innocent: (до этого момента ещё не напрограммировала, делаю список команд, точнее у вас копирую)
А по поводу pgm_read_word_near?

Что с ним не так
?
Не понял вопроса

Чем отличается pgm_read_word от pgm_read_word_near

Не понял, не вижу разницы.
Приведите пример/вопрос.

Опечаталась, исправила.

Не подскажу :thinking:
Не знаю, доки читать, может из коллег ща че подскажет.

Ничем.

Откройте файл pgmspace.h (он в папке <папка IDE>\hardware\tools\avr\avr\include\avr) и там легко найдёте такую строчку:

#define pgm_read_word(address_short)    pgm_read_word_near(address_short)

Так что, как видите …

По идее есть pgm_read_word_near и pgm_read_word_far. Отличаются длиной адреса и, соответственно, максимально допустимым адресным пространством. pgm_read_word_near, очевидно, может адресоваться только в первые 64К, что вполне приемлемо для Uno, но может оказаться недостаточно для Mega.
Ну а pgm_read_word, очевидно, псевдоним к какому-то из двух перечисленных. Соответствует режиму по умолчанию. Подробности Петрович выше уже изложил.

Спасибо.

#define MAX_BUF 50
#include "Modem.h"

Значение #define MAX_BUF 50 не будет видно в файле библиотеки Modem.h?
Это правильно?

ua6em (на старом форуме )

Наверно должно быть так:
SoftwareSerial SimPort(9, 10); // RX, TX
SIM800 mySim(SimPort);

А в классе я как объявлю SimPort? Каккой тип переменной?

это видимо к взрослым дядям вопрос, как в свой класс включить объект

может начать с функционала, а не с библиотеки.
И мы ж не видим кода Modem.h и всего остального что бы предметно советовать.
И если уж делать библиотеку, то все параметры буферов и прочего не должны быть видны остальному кодую

#define RX 9
#define TX 2
SoftwareSerial port(rx, tx);
#include "Modem.h"

Modem SIM800(port);

void setup() {
  Serial.begin(9600);
}

void loop() {
  }
//Modem.h
#pragma once
#include <Arduino.h>
class Modem {
  public:
    Modem (port);//??
  private:

};