Serielle Schnittstellen erkennen (Linux) [testen]

Serielle Schnittstellen erkennen (Linux) [testen]

Beitragvon MmVisual » 8. Nov 2014, 00:42 Serielle Schnittstellen erkennen (Linux) [testen]

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 8. Nov 2014, 19:19, insgesamt 1-mal geändert.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon mse » 8. Nov 2014, 08:19 Re: Serielle Schnittstellen erkennen (Linux)

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".
mse
 
Beiträge: 1933
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon MmVisual » 8. Nov 2014, 17:18 Re: Serielle Schnittstellen erkennen (Linux)

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


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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von MmVisual am 9. Nov 2014, 15:24, insgesamt 3-mal geändert.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon magnetron » 8. Nov 2014, 17:50 Re: Serielle Schnittstellen erkennen (Linux)

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
magnetron
 
Beiträge: 44
Registriert: 4. Nov 2014, 14:04

Beitragvon MmVisual » 8. Nov 2014, 18:01 Re: Serielle Schnittstellen erkennen (Linux)

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.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Eb » 8. Nov 2014, 18:54 Re: Serielle Schnittstellen erkennen (Linux)

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
Eb
 
Beiträge: 187
Registriert: 5. Feb 2008, 15:32
Wohnort: Stuttgart
OS, Lazarus, FPC: linux - Laz 1.4.2 | 
CPU-Target: 32Bit
Nach oben

Beitragvon MmVisual » 9. Nov 2014, 14:56 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon pluto » 1. Apr 2015, 17:21 Re: Serielle Schnittstellen erkennen (Linux) [testen]

Der Code klappt auch wunderbar unter Linux mint 17 64 Bit.
MFG
Michael Springwald
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6534
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

Beitragvon Maik81SE » 22. Dez 2015, 17:35 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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'
Maik81SE
 
Beiträge: 75
Registriert: 30. Sep 2011, 13:07
Wohnort: Lübeck
OS, Lazarus, FPC: Win7/(en)Debian/Ubuntu 14:10 (L 1.2.4+dfsg-1. FPC 2.6.x) | 
CPU-Target: 64bit; arm; avr
Nach oben

Beitragvon Mathias » 23. Dez 2015, 18:15 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 23. Dez 2015, 18:24 Re: Serielle Schnittstellen erkennen (Linux) [testen]

/dev/ttyACM0
Das ist vom Orignal Arduino

/dev/ttyUSB0
Das ist vom Clone.

hast du zwei Arduino Angeschlossen?
MFG
Michael Springwald
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6534
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 23. Dez 2015, 18:49 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 23. Dez 2015, 19:18 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6534
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 23. Dez 2015, 19:27 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 23. Dez 2015, 20:17 Re: Serielle Schnittstellen erkennen (Linux) [testen]

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6534
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Linux



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried