Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

BComPort как автоматически подключаться к нужному устройству


Andrewtitoff ©   (07.08.17 08:02

Ни как не могу сообразить как используя 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]

юный шахтер прикручивает вочдог к ригу


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо