On 11/28/22 5:31 AM, Bo Berglund via lazarus wrote:
I haved a debugging tool program created on Windows and I am orting it to Linux
Ubuntu.
It seems to build just fine except for a combobox fill function which uses the
Windows way of populating the selectoer box with the serial ports available on
the system.
This is the code I use on Windows:
[...]
I have looked at /dev/tty* but it lists a large number of items which makes it
impossible for me. I do not belive all of´them are real serial ports...

What can I do to get a selector for real serial ports on Ubuntu.


would you believe you asked almost this very same question back in 2015, 2018, 2020, and here again in 2022 :)


in Sep 2018, giuliano colla posted this procedure to you:

procedure TForm1.btnScanPortClick(Sender: TObject);
var
 PortNr: Integer;
 PortName: String;
 PortHandle: TSerialHandle;
begin
  cbSelPort.Items.Clear;
  cbSelPort.Text:= '';
{$IFDEF MSWINDOWS}
  for PortNr := 1 to 9 do begin
    PortName := 'COM' + IntToStr(PortNr);
    PortHandle := SerOpen('\\.\'+PortName);
    if PortHandle > 0 then begin
      cbSelPort.Items.Add(PortName);
      SerClose(PortHandle);
      if cbSelPort.Text = '' then begin
        cbSelPort.Text:=PortName;
        PortSel.Caption:= PortName;
        end;
      end;
    end;
{$ELSE}
  for PortNr := 0 to 9 do begin
    PortName := '/dev/ttyS' + IntToStr(PortNr);
    PortHandle := SerOpen(PortName);
    if PortHandle > 0 then begin
      if cbSelPort.Text = '' then begin
        cbSelPort.Text:=PortName;
        PortSel.Caption:= PortName;
        end;
      cbSelPort.Items.Add(PortName);
      SerClose(PortHandle);
      end;
    end;
  for PortNr := 0 to 9 do begin
    PortName := '/dev/ttyUSB' + IntToStr(PortNr);
    PortHandle := SerOpen(PortName);
    if PortHandle > 0 then begin
      if cbSelPort.Text = '' then begin
        cbSelPort.Text:=PortName;
        PortSel.Caption:= PortName;
        end;
      cbSelPort.Items.Add(PortName);
      SerClose(PortHandle);
      end;
    end;
{$ENDIF}
end;


and in that same thread in Sep 2018, mark morgan lloyd posted this function to 
you:

(* If there are no serial ports on the system then return NIL, otherwise a      
*)
(* TStringList.        *)
(*        *)
(* This returns an object, it is the caller's (eventual) responsibility to free 
*)
(* this.        *)
//
FUNCTION EnumeratePorts: TStringList;

(* On a Linux system with udev or similar the /dev directory will only contain  
*)
(* devices which have been detected as being present. On an older system it     
*)
(* will probably contain all possible devices so we need to restrict the list   
*)
(* to what's reasonable; the user should still be able to enter a device name   
*)
(* manually if necessary, e.g. where a machine with 2x standard ports plus a    
*)
(* 2-port card insists that it's got ttyS0, ttyS1, ttyS45 and ttyS46.        *)

CONST   countTtyS= 12;                  (* Main board plus an 8-port card       
*)
        countTtyUSB= 8;                 (* Four dual-port adapters         *)
        countTtyI= 4;                   (* A single 4-port ISDN card.         *)

VAR     searchRec: TSearchRec;
        counter: INTEGER;

BEGIN
  RESULT:= TStringList.Create;
  RESULT.Sorted:= TRUE;
  counter:= countTtyS;
  IF FindFirst('/dev/ttyS*', faSysFile, searchRec) = 0 THEN
    REPEAT
      RESULT.Append('/dev/' + searchRec.Name);
      DEC(counter)
    UNTIL (FindNext(searchRec) <> 0) OR (counter <= 0);
  FindClose(searchRec);
  counter:= countTtyUSB;
  IF FindFirst('/dev/ttyUSB*', faSysFile, searchRec) = 0 THEN
    REPEAT
      RESULT.Append('/dev/' + searchRec.Name);
      DEC(counter)
    UNTIL (FindNext(searchRec) <> 0) OR (counter <= 0);
  FindClose(searchRec);
  counter:= countTtyI;
  IF FindFirst('/dev/ttyI*', faSysFile, searchRec) = 0 THEN
    REPEAT
      RESULT.Append('/dev/' + searchRec.Name);
      DEC(counter)
    UNTIL (FindNext(searchRec) <> 0) OR (counter <= 0);
  FindClose(searchRec);
  IF Result.Count = 0 THEN
    FreeAndNil(RESULT)
END { EnumeratePorts } ;


in another thread back in Oct 2020, corps...@web.de posted this function to you:

Function GetSerialPortNames(): String;
Var
  sl: TStringlist;
Var
  Info: TSearchRec;
  hdl: THandle;
  b: Boolean;
Begin
  sl := TStringlist.create;
  If FindFirst('/dev/tty*', faSysFile, Info) = 0 Then Begin
    Repeat
      b := true;
      Try
        hdl := FileOpen('/dev/' + info.Name, fmOpenReadWrite);
        If hdl = -1 Then Begin
          b := false;
        End;
      Except
        b := false;
      End;
      If hdl >= 0 Then Begin
        FileClose(hdl);
      End;
      If b Then Begin
        sl.Add('/dev/' + info.Name);
      End;
    Until FindNext(info) <> 0;
  End;
  FindClose(Info);
  result := sl.CommaText;
  sl.free;
End;


i love having mailing list history in my email reader! :) :) :)


--
 NOTE: No off-list assistance is given without prior approval.
       *Please keep mailing list traffic on the list where it belongs!*
--
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to