Конференция "Начинающим" » BComPort как автоматически подключаться к нужному устройству
 
  • Andrewtitoff © (07.08.17 08:02) [0]
    Ни как не могу сообразить как используя BComPort организовать подключение к нужному устройству?, т.е. при загрузке программы берем из реестра список СОМ-портов, и начинаем перебирать их подключаясь и посылая запрос, получив нужный ответ нужно остановить перебор и остаться подключенным к нужному устройству.
    Собственно у меня загвоздка с получением ответа и остановкой цикла
  • ВладОшин © (07.08.17 08:45) [1]

    > при загрузке программы берем из реестра список СОМ-портов


    https://yandex.ru/search/?from=chromesearch&clid=2224314&text=BComPort&lr=195
    первая же ссылка
    там есть такой файл - BComPort.chm

    Процедура EnumComPorts позволяет получить список доступных на данном компьютере портов. Элемент полученного списка приложение может использовать для установки свойства Port компонента TBComPort.

    Пример

    begin
     EnumComPorts(ComboBox1.Items);
     // Выбор порта в списке ComboBox1 и выполнение других действий
     BComPort1.Port := ComboBox1.Text;
    end;

    остальное тоже описано
  • Andrewtitoff © (07.08.17 16:21) [2]
    А на вопрос нельзя было ответить?, или лишь бы что-то написать?..
  • Andrewtitoff © (07.08.17 16:22) [3]
    Номера портов давно получены и загрушены в комбобокс, как мне автоматически подключиться к нужному порту?..
  • rrrrrrr © (07.08.17 16:40) [4]
    "тебе" или "автоматически"?

    если тебе то смотри свойство актив или метод оупен.
    а если автоматически, то ничего не делай.
    оно само автоматически подключится.
    когда-нибудь
  • Andrewtitoff © (07.08.17 16:58) [5]
    Я наверно не очень правильно выразился, вопрос в том что в системе несколько CОМ-устройств, а программа должна при старте подключиться и остаться подключенной именно к нужному устройству. При у устройстве предусмотрен отклик - при отправке ему нужных команд оно откликается и сообщает что это именно.


    procedure COMs;
    var
     reg : TRegistry;
     ts : TStrings;
     i : integer;
     str: ansistring;
    begin
     reg := TRegistry.Create;
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('hardware\devicemap\serialcomm',
                 false);
     ts := TStringList.Create;
     reg.GetValueNames(ts);

     frmMain.ComboPortNum.Items.Clear;
     for i := 0 to ts.Count -1 do begin
     frmMain.ComboPortNum.Items.Add(reg.ReadString(ts.Strings[i]));
     frmMain.ComboPortNum.Text:=frmMain.ComboPortNum.Items.Strings[0];
      end;
     ts.Free;
     reg.CloseKey;
     reg.free;
       end;

    procedure TfrmMain.FormActivate(Sender: TObject);
    var
    str: ansistring;
    i: Integer;
    ii: Integer;
    t: array[1..255] of ansiChar;
    Count: Integer;

    begin
     if ComboPortNum.Items.Count > 0 then
     for i := 0 to ComboPortNum.Items.Count-1 do begin
      ComboPortNum.ItemIndex := i;
      VaComm1.Port := frmMain.ComboPortNum.Text;
      VaComm1.Open;
      if VaComm1.Connected then VaComm1.WriteStr('Who are you?');

      count:=10;
      Sleep(100);

      if copy(RichEdit1.Text,length(RichEdit1.Text)-8,8) = 'WatchDog' then
      Showmessage('Connected');
      end;
    end;

    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
     Application.onMinimize:=OnMinimizeProc;
     Application.OnMinimize(Self);
     COMs;
    end;

    procedure TfrmMain.VaComm1RxChar(Sender: TObject; Count: Integer);
    var str: ansistring;
       i: Integer;
       t: array[1..255] of ansiChar;
    begin
    str:= '';
    VaComm1.Read(t, count);
    for i:= 1 to count do begin
     str:= str + t[i];
    end;
    RichEdit1.SelAttributes.Color:=clblue;
    RichEdit1.Lines.add('Rx ' + IntToStr(Count) + ' bytes: '+str);
    RichEdit1.SelStart:=99999;
    RichEdit1.SetFocus;
    end;


  • rrrrrrr © (07.08.17 17:07) [6]
    при отправке ему нужных команд оно откликается и сообщает что это именно.


    все уже с самого первого раза поняли, что устройство на запросы отвечает.
  • Andrewtitoff © (07.08.17 17:15) [7]
    Ну ответа так и не дали, видимо не все поняли что отвечает.. ))
  • rrrrrrr © (07.08.17 17:16) [8]
    что тебе не дали?
    перебираешь порты.
    пишешь туда
    слушаешь оттуда.
    если оттуда говорят что это то, что ты ищешь,
    то это оно и есть.

    брейк из цикла.
  • Andrewtitoff © (07.08.17 17:19) [9]
    у  меня с пунктом "слушаешь оттуда" что-то не срастается.. (
  • rrrrrrr © (07.08.17 17:24) [10]
    искать компорт, не умея читать из него.
    этапять.

    попробуй делать наеоброт.
    сначала учишься читать из порта,
    а после начинаешь его искать.

    иначе вдруг он найдется, а читать ты еще не умеешь.
  • ВладОшин © (07.08.17 18:31) [11]
    BComPort.chm - читал?
  • Andrewtitoff © (08.08.17 00:57) [12]
    читал

     if ComboPortNum.Items.Count > 0 then
     for i := 0 to ComboPortNum.Items.Count-1 do begin
      ComboPortNum.ItemIndex := i;
      VaComm1.Port := frmMain.ComboPortNum.Text;
      VaComm1.Open;
      if VaComm1.Connected then VaComm1.WriteStr('Who are you?');

      Sleep(100);
      count:=VaComm1.InBufCount;
    str:= '';
    VaComm1.Read(t, count);
      Showmessage(inttostr(count));

    for ii:= 1 to count do begin
    str:= str + t[ii];
    end;

      if copy(RichEdit1.Text,length(RichEdit1.Text)-8,8) = 'Rx 8 bytes: WatchDog' then
      Showmessage('Connected');



      Showmessage(inttostr(count)); показывает 0
  • Германн © (08.08.17 01:36) [13]

    > Andrewtitoff ©   (07.08.17 17:19) [9]
    >
    > у  меня с пунктом "слушаешь оттуда" что-то не срастается.
    > . (
    >

    Ничего странного, что ничего (извините за тавтологию) не срастается.
    Компонент заточен на асинхронную работу с СОМ-портом. А его пытаются использовать в синхронном режиме. (Это к коду из поста 5).
    Пост 11 слишком урезанный, чтобы его можно было бы нормально прокомментировать. Единственно можно сказать только одно. Если этот код написан для работы с компонентом, то это бред.
  • Andrewtitoff © (08.08.17 01:45) [14]
    Полностью согласен, вот только как это сделать правильно я тоже не знаю..
  • Andrewtitoff © (08.08.17 02:15) [15]
    Сделал так:
    procedure TfrmMain.FormActivate(Sender: TObject);
    var
    i,c: Integer;
    begin
    if ComboPortNum.Items.Count > 0 then
     for i := 0 to ComboPortNum.Items.Count-1 do begin
      ComboPortNum.ItemIndex := i;
      VaComm1.Port := ComboPortNum.Text;
      VaComm1.Open;
      if VaComm1.Connected then VaComm1.WriteStr('Who are you?');
      c:=0;
     repeat
      Application.ProcessMessages;
      inc(c);
     until (RichEdit1.Text<>'')or(c>65565);

      if copy(RichEdit1.Text,length(RichEdit1.Text)-9,8) = 'WatchDog' then break;

      end;
    if VaComm1.Connected then RichEdit1.Lines.Add('WatchDog connected on '+ComboPortNum.Text)
     else  RichEdit1.Lines.Add('WatchDog not connected');
    end;

  • Германн © (08.08.17 02:56) [16]

    > Andrewtitoff ©   (08.08.17 02:15) [15]
    >
    > Сделал так:
    > procedure TfrmMain.FormActivate(Sender: TObject);

    Ну а при чем тут FormActivate? Это событие формы. А вы работаете с неким компонентом. У этого компонента свои события и свои обработчики. Что вам непонятно?
  • Inovet © (08.08.17 10:44) [17]
    > [15] Andrewtitoff ©   (08.08.17 02:15)
    >  if VaComm1.Connected then VaComm1.WriteStr('Who are you?> ');
    >  c:=0;
    > repeat
    >  Application.ProcessMessages;
    >  inc(c);
    > until (RichEdit1.Text<>'')or(c>65565);
    >
    >  if copy(RichEdit1.Text,length(RichEdit1.Text)-9,8) = 'WatchDog'
    > then break;

    А порты там не надо закрывать? И Timeout вроде как есть, может там не то прописано. Документацию на компонет надо изучать. И странные манипуляции с символами и строками явно лишние.

    Для отладки надо свой девайс сделть единственным в списке и проверить, как пудет с ним запись и чтение работать. Когда заработает - примет посыл и правильно ответит, второй порт в список добавить добавить какой-нить левый, чтобы ничего не было к нему подключено для начала. Ну это общие соображения.

    И ещё. Ответ на "'Who are you?"
    "WatchDog" - это Цербер что ли?

    Так оно как-то более обнадёживает, ну или как назовёшь корабль, так и поплывёт:

    Write
    Who are you who am I?
    Is it real do we touch the sky?

    Read
    Nothing's real - all disguise
    said the birds of paradise.
  • rrrrrrr © (08.08.17 14:15) [18]
    юный шахтер прикручивает вочдог к ригу
 
Конференция "Начинающим" » BComPort как автоматически подключаться к нужному устройству
Есть новые Нет новых   [118231   +22][b:0][p:0.003]