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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

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

Сообщение 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; - если удалось открыть - порт есть, возникла исключительная синуация - нет.
Но это не лучший вариант. Можно-ли как-то решить эту задачу "не через одно место"?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение 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.
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение 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');
  //----------------------------------------------------------------------------------
Ответить