Kennung Serielle Schnittstelle unter Linux
-
- 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
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.
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.
-
- Beiträge: 6923
- 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
Hier steht eine Lösung: http://www.lazarusforum.de/viewtopic.ph ... rts#p72839
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.
Dies ist auch nicht unbedingt sauber, besser ist es die Registry danach zu fragen.. Unter Windows ist das einfach, COMx durchgehen und schauen, ob sie sich öffnen läßt.
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
Mit Java und C/C++ sehe ich rot
-
- 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
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.
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.
Das hatte ich schon gefunden, und beim drittenmal Lesen - ja, das scheint so zu gehen. Klingt umständlich, werd ich aber mal testen.Mathias hat geschrieben:Hier steht eine Lösung: viewtopic.php?f=16&t=8230&p=72839&hilit=Ports#p72839
-
- Lazarusforum e. V.
- Beiträge: 7192
- 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
Unter Linux gibt es zwei Haupt Namen für USB Device's
1. ttyUSB+Zahl
2. ttyACM+Zahl
1. ttyUSB+Zahl
2. ttyACM+Zahl
MFG
Michael Springwald
Michael Springwald
-
- 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
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.
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.
-
- Beiträge: 6923
- 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
So habe ich das bei einem von meinen Programmen auch gemacht.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.
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.

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- 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
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?
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?
- 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
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
Unter Linux liegen die Geräte-Dateien unter /dev und etwaigen Unterverzeichnissen.
Mit findfirst/findnext abklappern nach ttyUSB* und ttyA*.
Jeweils testen.
Fertig
Winni
-
- 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
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?
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?
Re: Kennung Serielle Schnittstelle unter Linux
Hast du Berechtigungen an der Seriellen?
Gruß, Michael
- 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
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
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
-
- 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
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.
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.
- 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
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
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
-
- 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
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"?
Wo ist denn bitte "fast Dänemark"?
-
- 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
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.
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.