Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#1: 2007-12-19 21:27:03 ЛС | профиль | цитата
Пытаюсь реализовать диалог с GSM-модемом, подключенным в (виртуальный) COM-порт.
Диалог имеет примерно такой вид:
code_7980.txt

Время между запросом и ответом не фиксировано, и, теоретически, может меняться в зависимости от запроса. Хотелось бы организовать максимально универсальную схему, "общающуюся" с модемом таким образом. То есть общение с модемом происходит через вызов метода doChat некого мультиэлемента, которму передаются строка-запрос и ожидаемый ответа (или "шапка" ответа - e.g. "+CGMI"), и получения событися либо onReply, либо onError.

Общение должно идти асинхронно, не "замораживая" основной поток программы. Вот мои потуги на эту тему:
code_7981.txt
(В схеме применён "потусторонний" (с) компонент ComAsync v1.5 от Wolfik-а).

Внимание, вопрос: что я делаю не так, и как надо делать?
карма: 1

0
файлы: 2code_7980.txt [159B] [409], code_7981.txt [16.6KB] [531]
Ответов: 1328
Рейтинг: 69
#2: 2007-12-20 02:00:52 ЛС | профиль | цитата
iarspider, При долгой работе этот компонент зависает и держит порт пока не выдернешь шнур (я раньше его использовал но в итоге перешел на штатный)

карма: 2

0
Ответов: 241
Рейтинг: 45
#3: 2007-12-21 00:21:05 ЛС | профиль | цитата
iarspider, компонент называется асинхронный порт, потому, что он асинхронен сам по себе.
В выложенной выше схеме зачем то создается еще один поток, в итоге получается поток в потоке.
Компонент внутри себя сам создает поток процедуре ожидающей сведений от порта.
Чуть позже подретуширую его.
карма: 0

0
Ответов: 5446
Рейтинг: 323
#4: 2007-12-21 18:27:15 ЛС | профиль | цитата
Вся проблема в том, что мне нужно дождаться ОК от модема, и при этом не блокировать основной поток этим ожиданием...
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#5: 2007-12-21 20:03:53 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 12:57:06
карма: 0

0
Ответов: 5446
Рейтинг: 323
#6: 2007-12-21 22:11:44 ЛС | профиль | цитата
Уже переделал. Основным затыком было то, что следующую комманду надо посылать тогда, когда разобрался с ответом на предыдущую. То есть, по сути, "тактировать" ArrayEnum.
Сейчас собрал на стандартных компонентах тактированынй ArrayEnum (кстати, очень не хватает компонента "длина массива"!)

карма: 1

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#7: 2007-12-22 02:30:04 ЛС | профиль | цитата
iarspider писал(а):
очень не хватает компонента "длина массива"

А как же вот это
ArrayRW писал(а):
Count=Содержит кол-во элементов массива

карма: 22

0
Ответов: 5446
Рейтинг: 323
#8: 2007-12-22 11:41:10 ЛС | профиль | цитата
Блин, так и знал, что надо в "Точки" посмотреть
карма: 1

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#9: 2007-12-22 11:56:18 ЛС | профиль | цитата
iarspider писал(а):
что надо в "Точки" посмотреть
Ну вы батенька, и даете...
карма: 22

0
9
Сообщение
...
Прикрепленные файлы
(файлы не залиты)