Конференция "WinAPI" » COM Port - несколько последовательных команд [D7, WinXP]
 
  • 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]
    команды занести в список.
    Каждый элемент списка посылать после прихода ответа на предыд. команду.
  • Kolan © (16.04.10 11:43) [2]
    Или можно реализовать ожидание используя доп. потом и 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 работает сам по себе пришли данные в порт он их прочитал
 
Конференция "WinAPI" » COM Port - несколько последовательных команд [D7, WinXP]
Есть новые Нет новых   [118609   +48][b:0][p:0.001]