-
ivanoff (16.04.10 06:02) [0]использую CPortLib
нужно послать более одной команды последовательно но до того как послать след. команду надо дождаться у получить полный орвет на предыдущую команду.
надо так:
Button1Click...
ComPort.WriteStr(StrCmd1);
обработать орвет
ComPort.WriteStr(StrCmd2);
обработать орвет
ComPort.WriteStr(StrCmd3);
обработать орвет
орвет получаю в OnRxChar:
ComPortRxChar...
ComPort.ReadStr(S, Count)
... чет не получается ... кучу вариантов поперепробовал - думаю не туды копаю -
MBo © (16.04.10 06:51) [1]команды занести в список.
Каждый элемент списка посылать после прихода ответа на предыд. команду. -
Или можно реализовать ожидание используя доп. потом и WaitForSingleObject.
-
ivanoff (16.04.10 13:31) [3]
> команды занести в список.
на самом деле это тоже самое.
Вопрос как дойдаться ответа до посылки др. команды (ответ получаю в OnRxChar)
> реализовать ожидание используя доп. потом и WaitForSingleObject.
если можно чуть подробней - у меня не большой опыт б этом направлении -
Вариант (16.04.10 13:58) [4]
> ivanoff (16.04.10 13:31) [3]
Упрощенно так.
0) Установить индекс в списке = 0, перейти к 1
1) Если есть строка в списке Послать строку по индексу из списка, иначе завершить работу
2) Получить полный ответ-подтверждение (в OnRxChar)-> увеличить индекс на 1 и перейти к п. 1.
Надо написать функцию "Перейти к 1"(фактически просто реализация пункта 1 - посылка данных) и вызвать ее по кнопке "Старт" например и в обработчике OnRxChar после получения полного ответа.
Так же надо реализовать функцию "получить полный ответ" (сбор данных с порта,буферизация их анализ, удаление обработанных ответов), которая и будет инициатором последующих вызовов функции "Перейти к 1"
Так как схема упрощенная, то в дальнейшем возникнут и другие вопросы, моменты и грабли. Например реализация тайм - аута ожидания ответа от порта или "а что надо делать если пришел неверный ответ" ... и т.д. Реализуй начальную схему и постепенно добавляй в нее новые детали.
Вариант с доп. потоком не рассматриваю, так как тебе это в случае работы с компонентом не нужно (события компонента обрабатываются в главном потоке). -
MBo © (16.04.10 13:59) [5]>Вопрос как дойдаться ответа до посылки др. команды
ну как - сделать процедуру посылки очередной команды из списка. вызывать ее в начале, и из RxChar -
ivanoff (16.04.10 17:00) [6]по сути не удается разобраться с методом синхронизации/нитями ...
в OnRxChar стоит код который читает все данные и обрабатывает их - всё работает если посылаю по одной команде ... если посылаю более одной команды в PortMon вижу бардак.
мне надо реализовать, и думается без Thread не обойтись, типаfunction CP_Cmd(Cmd: String): String;
begin
...
Comport.WriteStr(Cmd);
дать отработать OnRxChar ... откуда и получу данные и результат обработки
только проблема в том что OnRxChar может вызыватся несколько раз пока не примуться все данные
и нужно както ждать пока примутся все данные но при этом дать OnRxChar собрать данные
------ здесь нужно дождаться конца нити чтения из ComPort-a -----Result := данные полученные посредством OnRxChar
end;...
R1 := CP_Cmd(Cmd1);
R2 := CP_Cmd(Cmd2);
R3 := CP_Cmd(Cmd3);
... -
MBo © (16.04.10 17:18) [7]в OnRxChar данные складываются в буферную строку, и вызывается процедура проверки целостности/завершенности посылки.
Если накоплена целая посылка, она удаляется из буфера и передается процедуре обработки -
ivanoff (16.04.10 18:31) [8]так в том то и дело что в моем сличае OnRxChar вызывается аж после
Comport.WriteStr(Cmd3);
а мне нужно после каждой ... да и дождаться пока соберуться все данные, в OnRxChar реализована проверка если пришли все данные
по сути не получается после WriteStr дать отработать OnRxChar и ждать до получения флажка что закончил из OnRxChar -
Германн © (16.04.10 19:01) [9]См. [1], [4] и [5].
-
ммм (30.04.15 17:59) [10]OnRxChar работает сам по себе пришли данные в порт он их прочитал