Пытаюсь реализовать диалог с GSM-модемом, подключенным в (виртуальный) COM-порт.
Диалог имеет примерно такой вид:
code_7980.txt
Время между запросом и ответом не фиксировано, и, теоретически, может меняться в зависимости от запроса. Хотелось бы организовать максимально универсальную схему, "общающуюся" с модемом таким образом. То есть общение с модемом происходит через вызов метода doChat некого мультиэлемента, которму передаются строка-запрос и ожидаемый ответа (или "шапка" ответа - e.g. "+CGMI"), и получения событися либо onReply, либо onError.
Общение должно идти асинхронно, не "замораживая" основной поток программы. Вот мои потуги на эту тему:
code_7981.txt
(В схеме применён "потусторонний" (с) компонент ComAsync v1.5 от Wolfik-а).
Внимание, вопрос: что я делаю не так, и как надо делать?
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
|
|||
карма: 1 |
| ||
файлы: 2 | code_7980.txt [159B] [409], code_7981.txt [16.6KB] [531] |
Ответов: 1328
Рейтинг: 69
|
|||
iarspider, При долгой работе этот компонент зависает и держит порт пока не выдернешь шнур (я раньше его использовал но в итоге перешел на штатный)
|
|||
карма: 2 |
|
Ответов: 241
Рейтинг: 45
|
|||
iarspider, компонент называется асинхронный порт, потому, что он асинхронен сам по себе.
В выложенной выше схеме зачем то создается еще один поток, в итоге получается поток в потоке. Компонент внутри себя сам создает поток процедуре ожидающей сведений от порта. Чуть позже подретуширую его. |
|||
карма: 0 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Вся проблема в том, что мне нужно дождаться ОК от модема, и при этом не блокировать основной поток этим ожиданием...
|
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2021-05-21 12:57:06 |
|||
карма: 0 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Уже переделал. Основным затыком было то, что следующую комманду надо посылать тогда, когда разобрался с ответом на предыдущую. То есть, по сути, "тактировать" ArrayEnum.
Сейчас собрал на стандартных компонентах тактированынй ArrayEnum (кстати, очень не хватает компонента "длина массива"!) |
|||
карма: 1 |
|
Разработчик
Ответов: 26304
Рейтинг: 2146
|
|||
iarspider писал(а): очень не хватает компонента "длина массива"А как же вот это ArrayRW писал(а): Count=Содержит кол-во элементов массива |
|||
карма: 22 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Блин, так и знал, что надо в "Точки" посмотреть
![]() |
|||
карма: 1 |
|
Разработчик
Ответов: 26304
Рейтинг: 2146
|
|||
iarspider писал(а): что надо в "Точки" посмотреть![]() |
|||
карма: 22 |
|
9