Поиск нужной строки при работе с Com портом
- Войдите на сайт для отправки комментариев
Пнд, 13/12/2021 - 01:44
Всем привет, работаю с GSM модулем SIM800L немного хочу доработать управляющую программу, чтобы была внешняя индикация его готовности (к примеру светодиодом) к работе.
Известно что запускается модуль командами в моем случае:
C++Выделить код | ||
|
Если, после загрузки программы в МК смотреть в com порт то выдает он примерно вот такие значения:
AT
ОК
AT+CLIP=1
ОК
AT+CMGF=1
ОК
Это означает что модуль готов и можно работать с ним.
Я хочу дописать программу так что если в выведенных значениях есть "ОК" то идет нужное мне действие...
Есть какой оператор который ищет в выведенных значениях в порт нужные данные ?
Есть какой оператор который ищет в выведенных значениях в порт нужные данные ?
нет.
Надо сначала собрать из порта строчку символ за символом, а уже потом в этой строке искать, например функциями strstr() strtok() ( вариантов поиска много)
Есть какой оператор который ищет в выведенных значениях в порт нужные данные ?
Такая "встроенная" возможность есть, но не всегда ее удобно использовать, т.к. если ничего не найдет, будет ждать время заданное в setTimeout() и блокировать выполнение остальной программы. А если данные идут постоянно, но не содержат искомого, то будет блокировать пока идут данные т.к. Timeout сбрасывается при чтении каждого очередного символа. И оно только ищет и отбрасывает просмотренные данные.
Serial.find(target, length)
https://www.arduino.cc/reference/en/language/functions/communication/serial/find/
Такая "встроенная" возможность есть, но не всегда ее удобно использовать
Serial.find(target, length)
это не "возможность", а сплошная профанация, не надо такое новичкам советовать
Вот такой функцией пользуюсь. Аналог find() , но не блокирует скетч.
Вызывается так же
Есть какой оператор который ищет в выведенных значениях в порт нужные данные ?
нет.
Надо сначала собрать из порта строчку символ за символом, а уже потом в этой строке искать, например функциями strstr() strtok() ( вариантов поиска много)
По хорошему надо не накапливать в строке, тем более, если заранее неизвестно, какой длины может быть строка, а разбирать сразу - по приходу очередного символа.
Есть какой оператор который ищет в выведенных значениях в порт нужные данные ?
Такая "встроенная" возможность есть, но не всегда ее удобно использовать, т.к. если ничего не найдет, будет ждать время заданное в setTimeout() и блокировать выполнение остальной программы. А если данные идут постоянно, но не содержат искомого, то будет блокировать пока идут данные т.к. Timeout сбрасывается при чтении каждого очередного символа. И оно только ищет и отбрасывает просмотренные данные.
Serial.find(target, length)
https://www.arduino.cc/reference/en/language/functions/communication/serial/find/
Понял, но эта часть должна выполняться void setup() так что по идеи блокировать выполнение основной программы не должно
Вот такой функцией пользуюсь. Аналог find() , но не блокирует скетч.
Спасибо буду пробовать
Пробовал через Serial.find(target, length) она ищет нужное значение или строку, но когда вручную вводишь его через терминал, если же вывод значений в послед порт указан в коде, то не может найти нужного .
Если через
if
(isMarker(
""
)
так вообще такого оператора нет, может дополнительные библиотеки нужно подключать.Если через
if
(isMarker(
""
)
так вообще такого оператора нет, может дополнительные библиотеки нужно подключать.пипец.... Вы язык Си знаете вообще? Вам исходный код "этого оператора" в сообщении #4 зачем дали, как вы думаете?
Если через
if
(isMarker(
""
)
так вообще такого оператора нет, может дополнительные библиотеки нужно подключать.Понимаю... Даже скетч не буду просить показать. Могу дать пример работы с АТ командами с ESP8266 запрос-ответ без блокировки скетча и с таймаутом. Надо?
[/quote]
Понимаю... Даже скетч не буду просить показать. Могу дать пример работы с АТ командами с ESP8266 запрос-ответ без блокировки скетча и с таймаутом. Надо?
[/quote]
Хорошо, давайте
SIM800 у меня нет под рукой, а ESP8266 подключена к меге. Для нее и будет пример.
При включении ESP ждет 5 сек и подключается к точке доступа на смартфоне. Если ESP не отвечает на команды, то происходит аппаратная перезагрузка модуля. Если точка доступа отключена, ESP пытается подключиться каждые 15 сек. После подключения к точке доступа, больше ничего не происходит- это просто пример. Все это происходит в фоновом режиме. Подредактируйте под свои задачи.
Спасибо!