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

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

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

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

Сообщение shyub » 14.06.2016 18:31:59

Пока знаю единственную возможность через консоль: 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; - если удалось открыть - порт есть, возникла исключительная синуация - нет.
Но это не лучший вариант. Можно-ли как-то решить эту задачу "не через одно место"?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

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

Сообщение WAYFARER » 15.06.2016 11:06:11

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.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

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

Сообщение shyub » 16.06.2016 12:39:23

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


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru