Kennung Serielle Schnittstelle unter Linux

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Kennung Serielle Schnittstelle unter Linux

Beitrag von Timm Thaler »

Für ein COM-Programm möchte ich die vorhandenen und verfügbaren seriellen Schnittstellen erkennen. Unter Windows ist das einfach, COMx durchgehen und schauen, ob sie sich öffnen läßt.

Unter Linux geht das prinzipiell auch, aber da gibt es anscheinend eine Vielzahl von Kennungen für die Serielle. Auf dem Raspi ist mir jetzt untergekommen: ttyS0 ist die vergeigte Standardschnittstelle auf dem Pi3, ttyAMA0 ist umgelenkte Schnittstelle vom Bluetooth, bei USB seriell Wandlern sind es ttyUSB0 und ttyUSB1.

Es scheint aber auch noch ttyACMx zu geben, und möglicherweise noch andere Formen. Welche sind euch bisher untergekommen?

Und nein, das scheint nicht trivial zu sein. Cutecom z.B. zeigt nur ttyS0 bis S3 an, ohne sie zu prüfen, die ttyAMA0 muss man von Hand eintragen. Gtkterm zeigt nur vorhandene ttySx und ttyUSBx an, aber nicht die ttyAMA0, und die kann man auch nicht eintragen, somit unbenutzbar.

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

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Mathias »

Hier steht eine Lösung: viewtopic.php?f=16&t=8230&p=72839&hilit=Ports#p72839

. Unter Windows ist das einfach, COMx durchgehen und schauen, ob sie sich öffnen läßt.

Dies ist auch nicht unbedingt sauber, besser ist es die Registry danach zu fragen.

Bei der Komponente Lazserial, ist solche ein Abfrage dabei.
Unter Windows funktioniert sie.

Für Linux gibt es sie dort auch, nur ist sie leider fehlerhaft.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Timm Thaler »

Für Windows habe ich die seit Jahren bewährte Methode, einfach die COMs durchzugehen.

Unter Linux ist das halt schwierig, weil anscheinend die Bezeichnung beliebig sein darf, sofern sie nur mit tty beginnt. Es gibt aber einen Haufen tty, die keine COM sind.

Achso, ich arbeite gerade mit der serial.pp und würde die auch gern beibehalten.

Mathias hat geschrieben:Hier steht eine Lösung: viewtopic.php?f=16&t=8230&p=72839&hilit=Ports#p72839


Das hatte ich schon gefunden, und beim drittenmal Lesen - ja, das scheint so zu gehen. Klingt umständlich, werd ich aber mal testen.

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: Kennung Serielle Schnittstelle unter Linux

Beitrag von pluto »

Unter Linux gibt es zwei Haupt Namen für USB Device's
1. ttyUSB+Zahl
2. ttyACM+Zahl
MFG
Michael Springwald

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Timm Thaler »

Also reicht es, wenn ich - falls ich nicht die aufwendige Variante will - folgende Kennungen durchgehe:

ttyS : standard RS232
ttyUSB : USB-seriell-Wandler
ttyACM : Modems bzw. neuerdings Mikrocontroller oder andere Devices
ttyAMA : der interne Uart im Raspi (beim 3er für Bluetooth benutzt) bzw. ARM-Controller

Außerdem werde ich die ComboBox für den Portselect editierbar machen, so dass der Benutzer eigene Kennungen reinschreiben kann, falls er was Exotisches hat. Genügt für meine Zwecke.

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

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Mathias »

Außerdem werde ich die ComboBox für den Portselect editierbar machen, so dass der Benutzer eigene Kennungen reinschreiben kann, falls er was Exotisches hat.

So habe ich das bei einem von meinen Programmen auch gemacht.

Stellt mal vor, ihr habt vor ein paar Jahren ein Programm geschrieben, welches den 9-Pol-Com-Port benutzt.
Dazu habe ihr alle ttyS* in eine Read-Only Combo-Box geschrieben.
Später will ein Anwender seine COM-Device, zB. an eine USB-Docking-Station anschliessen, und dort ist der Com-Port ttyUSB*, was passiert, der Anwender ist machtlos und klettert die Wände hoch. :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Matze66 »

Moin.

Ich habe einen Adapter USB-RS485, außerdem einen Adapter USB-RS232. Die hängen am ttyUSB0, "lsusb" listet auch noch die internen Komponenten wie den Root hub etc. auf.
Frage:
Wie kann ich die einzelnen Komponenten adressieren bzw. ansprechen? Die haben ja keinen kurzen Namen oder eine eindeutige Kennung, sondern werden alle auf Bus 0 mit einer ID aufgelistet.
Ich hatte es mit "Ser1.connect ('/dev/ttyUSB0')" versucht, bekomme keine Verbindung, da die eindeutige Kennung fehlt.

Setze ich die Devicenummer ein, klappt das auch nicht, außerdem wird diese Nummer nach jedem Abziehen und neu Aufstecken des Adapters inkrementiert. Könnte ich in einer Schleife abfragen, aber nur, wenn ich eine eindeutige Nummer dafür habe.

Haben diese Adapter eine eindeutige Kennung, und wenn ja, wo könnte ich die finden?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Winni »

Hi!

Unter Linux liegen die Geräte-Dateien unter /dev und etwaigen Unterverzeichnissen.

Mit findfirst/findnext abklappern nach ttyUSB* und ttyA*.
Jeweils testen.

Fertig

Winni

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Matze66 »

Moin Winni.

Die ttyUSB* bzw. A* habe ich bereits durch. In /dev liegen ja reichlich Dateien. Ich habe es auch mit der ID versucht:
Seriell1.Connect('/dev/serial/by-id/usb-1a86_USB2.0-Ser_-if00-port0');

Die ID ist korrekt, allerdings sagt mir Synase beim Ansprechen "Fehler beim Öffnen der Datei" (Zeile 2220-2223).
Nehme ich den USB0, brauche ich ja die ID, oder sehe ich das falsch? Der Bus bleibt doch bei 0?

Irgendeine Idee, wo mein (Syntax-)fehler liegt?

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von six1 »

Hast du Berechtigungen an der Seriellen?
Gruß, Michael

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Winni »

Hi!

Erstens kocht jede Distro ihr eigenes Süppchen bei den Geräte-Dateien.
Zweitens ändert sich das dauernd: Ich hab gerade festgestellt, dass Suse die ttyUSB* wegoptimiert hat.

Workaround - falls bei Dir die Struktur ähnlich ist:

mit lsusb die angeschlossenen USB-Geräte ausgeben lassen. Das ist dann Klartext plus Bus-Nummer plus Device-Nummer. Identifizier Dein Gerät.

Und dann spreche Dein Gerät an über

/dev/bus/usb/00[BusNummer]/00[DeviceNummer]

also z.B.

/dev/bus/usb/006/002

Hoffe das klappt.

Winni

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Matze66 »

Nun aber:

Seriell1.LinuxLock := False;
Seriell1.config(115200, 7, 'N', SB1, False, False); // vorläufig
Delay(2000);
Seriell1.Connect('//dev/serial/by-id/usb-1a86_USB2.0-Ser_-if00-port0');
Delay(2000);
Label3.Caption := 'Device: ' + Seriell1.Device + ' Status: ' + Seriell1.LastErrorDesc +' '+
Inttostr(Seriell1.LastError); // Prüfen ob offen

Meldung auf Label3: "Status: OK 0".

LinuxLock war es, ich dachte, der ist bereits in der Synase enthalten.

Die Kennung ist kilometerlang bei dem Adapter, wird unter lsusb allerdings anders aufgeführt als in der Datei.
Device7 abziehen und wieder einstecken: mutiert zu Device 8. Das wird inkrementiert, deshalb ist das problematisch mit der Devicenummer.

Die Berechtigungen sind i. O.

Der klappt also nicht wegen Inkrementierung der DeviceNummer bzw. nur einmal. Und ich muss immer damit rechnen, dass jemand (also ich) das Teil abzieht:
"/dev/bus/usb/00[BusNummer]/00[DeviceNummer]
also z.B.
/dev/bus/usb/006/002"

Vielen Dank für die Denkanstöße.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Winni »

Hi!

Na fein!

Das gleiche Gerät erhält bei wiederholtem Einstecken mit hoher Wahrscheinlichkeit eine andere Device-Nummer. Steht in der "Hot-Plug"-Spezifikation.

Im Gegensatz zu den Linux-Urzeiten kann man diverse Geräte über verschiedene Wege ansprechen. Serielle Schnittstellen
* über ttyUSB*,
* über die ID - wie Du es machst,
* über den USB-Bus wie gezeigt und
* da das ganze USB-Geraffel auch nur ein PCIe-Gerät ist, geht es auch über PCI, z.B. meine Maus ist

/dev/input/by-path/pci-0000:09:00.3-usb-0:2:1.0-mouse

Alle Wege führen nach Rom.....

Winni

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Matze66 »

Die Hot-Plug-Spezifikationen kannte ich so nicht, ich dachte, die bleiben trotz Umstecken bei der erstmaligen Kennung. Man lernt nie aus.

Wo ist denn bitte "fast Dänemark"?

Matze66
Beiträge: 29
Registriert: Mo 15. Mär 2021, 14:09
OS, Lazarus, FPC: Lazarus-Ide 2.0.0 auf Debian Raspberry Pi3
CPU-Target: Msp430, Raspberry
Wohnort: bei Itzehoe

Re: Kennung Serielle Schnittstelle unter Linux

Beitrag von Matze66 »

Noch ein kleines Problem:

Usb-Kabel an Wechselrichter, die Schnittstelle wird erkannt als "/dev/bus/usb/001/004" bzw. mit dem korrekten Gerätenamen unter "lsusb" (Usb to serial). Es wird allerdings keine Schnittstellendatei unter "dev/serial/by-id" oder "dev/serial/by-path" angelegt.
Also ansprechen mit "/dev/bus/usb/001/004".
Ergebnis: Permission denied (13). Wohl fehlende Rechte meines Programms.

Hat jemand eine Lösung für mich? Mir ist nicht klar, wie ich einem Programm die Rechte einräumen kann.

Antworten