Serielle Schnittstellen erkennen (Linux) [testen]

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von MmVisual »

Hallo,

Ich suche für Linux eine Möglichkeit zu erkennen welche seriellen Schnittstellen es tatsächlich alles gibt. Ich habe ziemlich lange gesucht und nur das gefunden:
http://stackoverflow.com/questions/2530 ... ening-them

Aber leider in C und ich weiß nicht wirklich wie ich das in Pascal umschreiben kann. (z.B. der Befehl: ioctl(fd, TIOCGSERIAL, &serinfo))

Diese Funktion:

Code: Alles auswählen

  for i := 0 To 50 Do
  Begin
    If FileExists('/dev/ttyUSB' + inttostr(i)) Then
    Begin
      h := SerOpen('/dev/ttyUSB' + inttostr(i));
      if h > 0 Then
      Try
        SerClose(h);
        sl.Add('ttyUSB' + inttostr(i));
      Except
      End;
    End;
  End;
  for i := 0 To 50 Do
  Begin
    If FileExists('/dev/ttyS' + inttostr(i)) Then
    Begin
      h := SerOpen('/dev/ttyS' + inttostr(i));
      if h > 0 Then
      Try
        SerClose(h);
        sl.Add('ttyS' + inttostr(i));
      Except
      End;
    End;
  End;

Ist auch mehr eine Krücke und zeigt nicht die echten Ports an. Habe ich in einem anderen Thread gefunden.
Weiß jemand wie das richtig geht? Ich bin jetzt auch nicht der Linux Experte.

Vielen Dank im Voraus, Grüße Markus.
Zuletzt geändert von MmVisual am Sa 8. Nov 2014, 19:19, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Serielle Schnittstellen erkennen (Linux)

Beitrag von mse »

MmVisual hat geschrieben:Aber leider in C und ich weiß nicht wirklich wie ich das in Pascal umschreiben kann. (z.B. der Befehl: ioctl(fd, TIOCGSERIAL, &serinfo))

"fpioctl()" aus der unit "baseunix".

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Serielle Schnittstellen erkennen (Linux)

Beitrag von MmVisual »

Danke für den Tipp! Danach war es leicht das um zu setzen. :D :D

Kann die EXE "projekt1" bitte wer auf echten Linux Distris testen und hier Bescheid geben?
Alles im ZIP, EXE und Quellcode:
TestCOMPort_Linux.zip
(1.93 MiB) 325-mal heruntergeladen


Wenn das Klappt will ich das den Synaser-Leuten mitteilen, dass die diese Funktion dort rein nehmen. Denn das was dort drin ist funktioniert überhaupt nicht.

Hier der Code:

Code: Alles auswählen

uses BaseUnix;
function GetSerialPortNames: string;
type
TSerialStruct = packed record
  typ: Integer;
  line: Integer;
  port: Cardinal;
  irq: Integer;
  flags: Integer;
  xmit_fifo_size: Integer;
  custom_divisor: Integer;
  baud_base: Integer;
  close_delay: Word;
  io_type: Char;
  reserved_char: Char;
  hub6: Integer;
  closing_wait: Word; // time to wait before closing
  closing_wait2: Word; // no longer used...
  iomem_base: ^Char;
  iomem_reg_shift: Word;
  port_high: Cardinal;
  iomap_base: LongWord; // cookie passed into ioremap
end;
var
  i: Integer;
  sr : TSearchRec;
  sl: TStringList;
  st: stat;
  s: String;
  fd: PtrInt;
  Ser : TSerialStruct;
const TIOCGSERIAL = $541E;
  PORT_UNKNOWN = 0;
begin
  Result := '';
  sl := TStringList.Create;
  try
    // 1. Alle möglichen Ports finden
    if FindFirst('/sys/class/tty/*', LongInt($FFFFFFFF), sr) = 0 then
    begin
      repeat
        if (sr.Name <> '.') and (sr.Name <> '..') Then
          if (sr.Attr and LongInt($FFFFFFFF)) = Sr.Attr then
            sl.Add(sr.Name);
      until FindNext(sr) <> 0;
    end;
    FindClose(sr);
    // 2. heraussuchen ob ./device/driver vorhanden ist
    for i := sl.Count - 1 Downto 0 Do
    Begin
      If Not DirectoryExists('/sys/class/tty/' + sl[i] + '/device/driver') Then
        sl.Delete(i); // Nicht vorhanden >> Port existiert nicht
    end;
    // 3. Herausfinden welcher Treiber
    st.st_mode := 0;
    for i := sl.Count - 1 Downto 0 Do
    Begin
      IF fpLstat('/sys/class/tty/' + sl[i] + '/device', st) = 0 Then
      Begin
        if fpS_ISLNK(st.st_mode) Then
        Begin
          s := fpReadLink('/sys/class/tty/' + sl[i] + '/device/driver');
          s := ExtractFileName(s);
          // 4. Bei serial8250 Treiber muss der Port geprüft werden
          If s = 'serial8250' Then
          Begin
            sl.Objects[i] := TObject(PtrInt(1));
            fd := FpOpen('/dev/' + sl[i], O_RDWR Or O_NONBLOCK Or O_NOCTTY);
            If fd > 0 Then
            Begin
              If FpIOCtl(fd, TIOCGSERIAL, @Ser) = 0 Then
              Begin
                If Ser.typ = PORT_UNKNOWN Then // PORT_UNKNOWN
                  sl.Delete(i);
              end;
              FpClose(fd);
            end else sl.Delete(i); // Port kann nicht geöffnet werden
          end;
        End;
      end;
    end;
    // 5. Dev anhängen
    for i := 0 To sl.Count - 1 Do
      sl[i] := '/dev/' + sl[i];
   Result := sl.CommaText;
  finally
    sl.Free;
  end;
end;


Vielen Dank, Grüße Markus.
Zuletzt geändert von MmVisual am So 9. Nov 2014, 15:24, insgesamt 3-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Serielle Schnittstellen erkennen (Linux)

Beitrag von magnetron »

Hallo Markus,

danke - eine nützliche Sache.
Also bei mir funktioniert Dein Testprog ootb auf Kubuntu 14.04 - 32bit (linux 3.13.0), mit Lazarus 1.2.6.
Allerdings bleibt der Nachteil, daß man nie weis, welche Schnittstelle nun was macht.

Ich habe zum Beispiel beim Test folgenden output:
/dev/ttyS0 (dürfte die interne RS232 sein)
/dev/ttyS4 (dürfte die RS232 der dockingstation sein)
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2 (alle drei "qualcom USB modem converter" - was auch immer das ist, es ist eher uninteressant, kann man vermutlich nichts gegen machen)
/dev/ttyUSB3 (erscheint korrekt wenn ein USB-seriell dongle eingesteckt ist, sonst wird /dev/ttyUSB3 nicht angezeigt).

Hoffe das hilft weiter, Grüße, Stefan

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Serielle Schnittstellen erkennen (Linux)

Beitrag von MmVisual »

Vielen Dank für die Rückmeldung! Wo genau welche Schnittstelle nun ist, das weiß man unter Windows auch nicht, das muss man schon irgendwie herausfinden. Bei den festen COM Ports am Main Board kann man wenigstens noch in der Beschreibung des Main Boards nachschauen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Serielle Schnittstellen erkennen (Linux)

Beitrag von Eb »

Hallo,

Habe auch Kubuntu 14.04, 32.bit - Lazarus 1.2.4 und es funktioniert perfekt.
Wenn ich nichts angeschlossen habe zeigt er
/dev/ttyS0 (Com-Port auf dem Mainboard)

wenn meine beiden Arduinos angeschlossen sind, zeigt er beide korrekt an:
/dev/ttyS0
/dev/ttyACM0
/dev/ttyUSB0

Sehr praktisch!
Vielen Dank,
Eb

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von MmVisual »

Hallo EB,
Vielen Dank für den Test.
Wenn Du mit Elektronik was machst kann evt auch dieses EleLa Projekt für Dich interessant sein:
http://www.mikrocontroller.net/topic/31 ... 70#3876270
Hier die neue EXE für Linux.
Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von pluto »

Der Code klappt auch wunderbar unter Linux mint 17 64 Bit.
MFG
Michael Springwald

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von Maik81SE »

Läuft auch bei mir Ohne weitere Probleme.

2 von 3 werden angezeigt.
der Letzte, Gut da brauche ich noch eine .rules, welche das EVALeDIPTFT32 also Echte Schnittstelle erzwingt und nicht als Grafikinterface erkennt. o.O

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von Mathias »

Kann die EXE "projekt1" bitte wer auf echten Linux Distris testen und hier Bescheid geben?
Alles im ZIP, EXE und Quellcode:
TestCOMPort_Linux.zip

Ich habe folgende Ausgabe:

Code: Alles auswählen

/dev/ttyACM0
/dev/ttyUSB0


USB0 ist mein Arduino.
Aber was ist ACM0 ?

Meine OnBoard-Schnittstelle kann es nicht sein, die wird als

Code: Alles auswählen

/dev/tty0 
angezeigt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von pluto »

/dev/ttyACM0
Das ist vom Orignal Arduino

/dev/ttyUSB0
Das ist vom Clone.

hast du zwei Arduino Angeschlossen?
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von Mathias »

hast du zwei Arduino Angeschlossen?
nein.

Das ist vom Clone.

Wen das ein Clon wäre, dann müssten doch beide Varianten gehen ?

Code: Alles auswählen

//  ser.Connect('/dev/ttyUSB0');
  ser.Connect('/dev/ttyACM0')

Status Ok kommt zwar, aber es kommen keine Daten.

Die OnBoard-Schnittstelle habe ich wieder deaktiviert.

Im Arduino-Programmer geht ACM0 auch nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von pluto »

Komisch das das USB Gerät gleich zwei tty Schnittstellen belegt.

Ich kenne das z.b. von meinem UMTS Stick.
Was genau hast du denn Angeschlossen?

mach doch mal ein lsusb.
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von Mathias »

mach doch mal ein lsusb.

Code: Alles auswählen

Bus 004 Device 004: ID 05e3:0716 Genesys Logic, Inc. USB 2.0 Multislot Card Reader/Writer
Bus 004 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 004: ID 046d:c050 Logitech, Inc. RX 250 Optical Mouse
Bus 003 Device 003: ID 046a:0011 Cherry GmbH G83 (RS 6000) Keyboard
Bus 003 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II], GT-I9300 Phone [Galaxy S III], GT-P7500 [Galaxy Tab 10.1]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Serielle Schnittstellen erkennen (Linux) [testen]

Beitrag von pluto »

Wie ich mir gedacht habe:
Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II], GT-I9300 Phone [Galaxy S III], GT-P7500 [Galaxy Tab 10.1]

Ein Telefon meldet sich ebenfalls mit zwei Schnittstellen an.
(Soweit ich jedenfalls weiß)
Klem das mal ab und schau mal ob ttyACM0 immer noch da ist.

Was genau hast du Eigentlich vor?
MFG
Michael Springwald

Antworten