Чисто эстетство, чтобы в скобочках и уровнях вложения меньше путаться:
case nn: {
// перевернули условие, чтобы выходить сразу, если время не пришло.
if (millis() - modem_setup_tmr < TIMEOUT_TIME) { break; }
....
break;
}
Чисто эстетство, чтобы в скобочках и уровнях вложения меньше путаться:
case nn: {
// перевернули условие, чтобы выходить сразу, если время не пришло.
if (millis() - modem_setup_tmr < TIMEOUT_TIME) { break; }
....
break;
}
if (millis() - modem_setup_tmr < TIMEOUT_TIME) {break; }
Получается сразу выходим из case ?
По задумке - да.
В даташите sim800l на многие команды время отклика указано как не определено, в реальности 3…5 секунд достаточно, но есть и те у которых конкретное время ответа, поэтому универсальная конструкция сверка с одним и тем же временем отклика не взлетает (
Не очищать буфер приёма при заполнении, просто сдвигать позицию записи на ноль. Написать свою функцию поиска подстроки в буфере вместо стандартных С. Есть же примеры.
очень много повторяющегося кода.
Напишите функцию, которая получает на входе строчку с командой и ожидает от модем ответа ОК - у вас код уменьшится раз пять
Я прошу прощения, но до меня только сейчас дошло, что ответ OK приходит только на запрашиваемые команды
![]()
А я то сначала проверяла та ли команда, а потом ОК или нет.
А мне всё твердят, отправила команду, дождалась ответа, и только потом отправила следующую команду…
Ну бывает, ну случается…
таймер еще на каждую команду, а то можно и не дождаться ответа.
А вы DTMF используете?
код нажатой кнопки и время удержания нажатия, в мс
Какое время удержания нажатия максимальное получается?
И вопрос по хранению команд
void setup() {}
void loop() {}
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
Добавляю массив
char *conf_commands[] = {
"ATE1",//0---Включить эхо.
"ATV1",//1---Полные заголовки и текстовые овтеты.
"AT+CLIP=1",//2--- // Включить АОН.
"AT+CMGF=1",//3---Включить TextMode для SMS.
"AT+CPBS=\"SM\"",//4---Память SIM-карты.
"AT+DDET=1,0,1",//4---Память SIM-карты.
};
void setup() {}
void loop() {}
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
Почему показывает одинаковые значения?
видимо ввиду того что не используете компилятор его выкинул
Нет, скетч есть старом форуме, тут недавно в Ищу исполнителя ссылка была, в dtmf модем сам распознает и просто вываливает команду.
Дело вкуса, начинал с массивов команд, пытался как то унифицировать, потом пришло понимание, что команд много, реакция на них разная, время ожидание тоже, логика универсальная получается слишком сложной.
Перешёл просто выбором режимов switch/enum и команды в коде прописываю.
AT+DDET=1,500,1
При быстром нажатии на кнопки получаю
+DTMF: 9,700
+DTMF: 9,760
+DTMF: 9,640
+DTMF: 9,440
+DTMF: 9,620
Всегда разные значения даже если держу кнопку долго.
Не нашла.
Снимаю вопрос.
С другого телефона всё ок,.
наверное надо почитать что означают эти цифры - нет?
if (s800lib::findResp((char *)"+DTMF: ", br)) { // кнопка нажата
_dtmf_press = 1;
}
if (_dtmf_press) {
if ((isdigit(br)) || (br == '#') || (br == '*')) {
_dtmf_press = 0; _dtmf_key = br;
currentReport = keyPressDTMF; return true;
}
}
Я про длину импульса, с одного телефона держу кнопку - и 1000 и 2000 …
а с моего максимум 900мс.
как интересно вы в GSM сети меряли импульс который DTMF приходящий на SIM800L ![]()
и главное зачем?