-
Ни как не могу сообразить как используя BComPort организовать подключение к нужному устройству?, т.е. при загрузке программы берем из реестра список СОМ-портов, и начинаем перебирать их подключаясь и посылая запрос, получив нужный ответ нужно остановить перебор и остаться подключенным к нужному устройству. Собственно у меня загвоздка с получением ответа и остановкой цикла
-
> при загрузке программы берем из реестра список СОМ-портов 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; остальное тоже описано
-
А на вопрос нельзя было ответить?, или лишь бы что-то написать?..
-
Номера портов давно получены и загрушены в комбобокс, как мне автоматически подключиться к нужному порту?..
-
"тебе" или "автоматически"?
если тебе то смотри свойство актив или метод оупен. а если автоматически, то ничего не делай. оно само автоматически подключится. когда-нибудь
-
Я наверно не очень правильно выразился, вопрос в том что в системе несколько 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;
-
при отправке ему нужных команд оно откликается и сообщает что это именно.
все уже с самого первого раза поняли, что устройство на запросы отвечает.
-
Ну ответа так и не дали, видимо не все поняли что отвечает.. ))
-
что тебе не дали? перебираешь порты. пишешь туда слушаешь оттуда. если оттуда говорят что это то, что ты ищешь, то это оно и есть.
брейк из цикла.
-
у меня с пунктом "слушаешь оттуда" что-то не срастается.. (
-
искать компорт, не умея читать из него. этапять.
попробуй делать наеоброт. сначала учишься читать из порта, а после начинаешь его искать.
иначе вдруг он найдется, а читать ты еще не умеешь.
-
BComPort.chm - читал?
-
читал 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
-
> Andrewtitoff © (07.08.17 17:19) [9] > > у меня с пунктом "слушаешь оттуда" что-то не срастается. > . ( >
Ничего странного, что ничего (извините за тавтологию) не срастается. Компонент заточен на асинхронную работу с СОМ-портом. А его пытаются использовать в синхронном режиме. (Это к коду из поста 5). Пост 11 слишком урезанный, чтобы его можно было бы нормально прокомментировать. Единственно можно сказать только одно. Если этот код написан для работы с компонентом, то это бред.
-
Полностью согласен, вот только как это сделать правильно я тоже не знаю..
-
Сделал так: 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;
-
> Andrewtitoff © (08.08.17 02:15) [15] > > Сделал так: > procedure TfrmMain.FormActivate(Sender: TObject);
Ну а при чем тут FormActivate? Это событие формы. А вы работаете с неким компонентом. У этого компонента свои события и свои обработчики. Что вам непонятно?
-
> [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.
-
юный шахтер прикручивает вочдог к ригу
|