Страница 1 из 1

Можно ли в Ubuntu программно узнать о наличии COM-портов?

СообщениеДобавлено: 14.06.2016 18:31:59
shyub
Пока знаю единственную возможность через консоль: dmesg | grep ttyS
Пробовал вот так:
Код: Выделить всё
procedure TForm1.Button7Click(Sender: TObject);
var
  S: String;
  n: integer;
begin
  ComboBox1.Clear;
  for n:=1 to 30 do begin
    S:='COM'+IntToStr(n);
    LazSerial3.SynSer.Connect(S);
    if LazSerial3.SynSer.Handle <> THandle(-1) then begin
      LazSerial3.SynSer.CloseSocket;
      ComboBox1.Items.Add(S);
    end;
  end;
  ComboBox1.Text:='Поиск завершён';
end;

Проверял в Windows-е - находит все не занятые порты. В Ubuntu находит все 30, хотя реально есть COM1 и COM2 и на момент проверки специально через них вёл обмен.
Можно, конечно, последовательно через LazSerial1.Open; - LazSerial1.Close; - если удалось открыть - порт есть, возникла исключительная синуация - нет.
Но это не лучший вариант. Можно-ли как-то решить эту задачу "не через одно место"?

Re: Можно ли в Ubuntu программно узнать о наличии COM-портов

СообщениеДобавлено: 15.06.2016 11:06:11
WAYFARER
shyub писал(а):Пока знаю единственную возможность через консоль: dmesg | grep ttyS

Так и получайте.

Код: Выделить всё
uses process;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TProcess;
  AStringList: TStringList;
  i: integer;
begin
  AProcess := TProcess.Create(nil);
  AStringList := TStringList.Create;
  AProcess.CommandLine := 'bash -c "/bin/dmesg | grep ttyS"';
  AProcess.Options := AProcess.Options + [poUsePipes, poNoConsole];
  AProcess.Execute;
  AStringList.LoadFromStream(AProcess.Output);
  if AStringList.Count > 0 then
    for i := 0 to AStringList.Count - 1 do
      ComboBox1.Items.Add(AStringList[i]);
  AStringList.Free;
  AProcess.Terminate(i);
  AProcess.Free;
end;                 


Добавлено спустя 3 часа 10 минут 47 секунд:
Re: Можно ли в Ubuntu программно узнать о наличии COM-портов?
Еще можно задействовать libserialport, нужно будет написать обертку для fp.

Re: Можно ли в Ubuntu программно узнать о наличии COM-портов

СообщениеДобавлено: 16.06.2016 12:39:23
shyub
WAYFARER, спасибо!
Работает прекрасно, но выдаёт вот такое предупреждение: unit1.pas(52,12) Warning: Symbol "CommandLine" is deprecated.
Переделал, как рекомендуют:
Код: Выделить всё
  //AProcess.CommandLine := 'bash -c "/bin/dmesg | grep ttyS"'; // В FPC-3.0 не рекомендуется.
  //------------В FPC-3.0 предлагается заменить на Executable и Parameters------------
  AProcess.Executable :='bash';
  AProcess.Parameters.Add('-c');
  AProcess.Parameters.Add('/bin/dmesg | grep ttyS');
  //----------------------------------------------------------------------------------