FT232RL funktioniert nur halb unter Linux (Ubuntu)

OP #3839976
Hallo zusammen,

ich habe leider ein riesen Problem mit einem FT232RL.

Der FT232 wird korrekt erkannt und ttyUSB0 zugeordnet.
Wenn ich nun mit einem Terminalprogramm wie z.B. CuteCom darauf 
zugreifen möchte, funktioniert alles super.

Allerdings benötige ich unbedingt Zugriff durch ein C++-Programm, 
welches die Bibliothek QtSerialPort nutzt. Das Programm ansich habe ich 
auch schon mit einem BTM-222 getestet, welches sich als rfcomm0 
einbinden lässt. Hier funktioniert alles super.

Aber mit dem FT232RL öffnet sich nur ein leeres Konsolenfenster und die 
Anwendung bleibt hängen. Ich bekomme keine Fehlermeldungen.

Ich tippe auf irgend ein Rechte- oder Initialisierungsproblem.
Googlen hat leider bisher nichts geholfen.

Ich hoffe ihr könnt mir helfen.

Vielen Dank :-)

Das hier gibt dmesg aus:
1
[17118.389518] usb 2-2.2: new full-speed USB device number 7 using uhci_hcd
2
[17118.890094] usb 2-2.2: New USB device found, idVendor=0403, idProduct=6001
3
[17118.890098] usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
4
[17118.890099] usb 2-2.2: Product: FT232R USB UART
5
[17118.890100] usb 2-2.2: Manufacturer: FTDI
6
[17118.890101] usb 2-2.2: SerialNumber: A602KBZE
7
[17118.937071] ftdi_sio 2-2.2:1.0: FTDI USB Serial Device converter detected
8
[17118.937119] usb 2-2.2: Detected FT232RL
9
[17118.937121] usb 2-2.2: Number of endpoints 2
10
[17118.937123] usb 2-2.2: Endpoint 1 MaxPacketSize 64
11
[17118.937123] usb 2-2.2: Endpoint 2 MaxPacketSize 64
12
[17118.937124] usb 2-2.2: Setting MaxPacketSize 64
13
[17118.968383] usb 2-2.2: FTDI USB Serial Device converter now attached to ttyUSB0

Und so wird es in Cpp initialisiert:
1
serial.setPortName("/dev/ttyUSB0");  // oder /dev/rfcomm0 für BTM-222
2
serial.open(QIODevice::WriteOnly); //ReadWrite
3
serial.setBaudRate(QSerialPort::Baud19200);
4
serial.setDataBits(QSerialPort::Data8);
5
serial.setParity(QSerialPort::NoParity);
6
serial.setStopBits(QSerialPort::OneStop);
7
serial.setFlowControl(QSerialPort::NoFlowControl);
OP
Peter II schrieb:
> R. B. schrieb:
>> Anwendung bleibt hängen
>
> und wo bleibt sie hängen?

Das Programm bleibt direkt beim Anfang, der Initialisierung der 
seriellen Schnittstelle hängen.

Wie ich genaueres sichtbar machen kann, weiß ich leider nicht.


Ich denke, dass das Programm beim Zugriff auf ttyUSB0 Probleme hat.

Leider kenne ich mich nicht so gut mit Linux aus und weiß nicht, was für 
Rechte ein Programm braucht, um die Schnittstelle bedienen zu können.

Ich habe den ausführenden Nutzer schon der Gruppe "Dialout" hinzugefügt, 
aber das hat nichts geholfen.
Gast
> Wie ich genaueres sichtbar machen kann, weiß ich leider nicht.

printf? fprintf? cout? cerr? $debugger?

> Ich habe den ausführenden Nutzer schon der Gruppe "Dialout" hinzugefügt,
> aber das hat nichts geholfen.

Wenns daran läg bekämst Du entsprechende Fehler (die Du ja hoffentlich 
irgendwo abfängst).
OP
Peter II schrieb:
> R. B. schrieb:
>> Wie ich genaueres sichtbar machen kann, weiß ich leider nicht.
>
> dann debugge es oder schreibt ein paar prints rein.
>
> es hängt hilft nicht gerade bei der Fehlersuche.

Sorry, bin schon etwas müde ;-)
Habs gerade getestet.
Es hängt beim öffnen der Schnittstelle 
(serial.open(QIODevice::WriteOnly);)

Das bedeutet ein Terminalprogramm kann die Schnittstelle öffnen, mein 
C++-Programm allerdings bekommt keinen Zugriff. :-(
Gast
> Das bedeutet ein Terminalprogramm kann die Schnittstelle öffnen, mein
> C++-Programm allerdings bekommt keinen Zugriff.

Hängt da noch ein altes Lockfile rum? lass mal strace drauf los.
OP
g457 schrieb:
>> Das bedeutet ein Terminalprogramm kann die Schnittstelle öffnen, mein
>> C++-Programm allerdings bekommt keinen Zugriff.
>
> Hängt da noch ein altes Lockfile rum? lass mal strace drauf los.

Das kannte ich noch gar nicht.

Ich habe jetzt mal nur den Teil kopiert, der für mich interessant zu 
sein scheint. Der Teil wiederholt sich vielfach hintereinander.
Hier das Ergebnis:
1
access("/var/lock", R_OK)               = 0
2
access("/var/lock", W_OK)               = 0
3
open("/dev/ttyUSB0", O_WRONLY|O_NOCTTY|O_NONBLOCK) = 16
4
uname({sys="Linux", node="ubuntu", ...}) = 0
5
open("/var/lock/LCK..ttyUSB0", O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644) = -1 EEXIST (File exists)
6
open("/var/lock/LCK..ttyUSB0", O_RDONLY|O_CLOEXEC) = 17
7
fcntl(17, F_SETFD, FD_CLOEXEC)          = 0
8
fstat(17, {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
9
fstat(17, {st_mode=S_IFREG|0644, st_size=13, ...}) = 0
10
read(17, "4516\n\nubuntu\n", 16384)     = 13
11
read(17, "", 16371)                     = 0
12
brk(0x1790000)                          = 0x1790000
13
close(17)                               = 0
14
nanosleep({0, 100000000}, 0x7fff56dce170) = 0

Ich muss gestehen, dass ich hier nichts draus lesen kann.
Gast
> open("/var/lock/LCK..ttyUSB0", O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644)
> = -1 EEXIST (File exists)

..das Lockfile gibts schon

> read(17, "4516\n\nubuntu\n", 16384)     = 13

..geraten: es gibt einen Prozess mit pid 4516, dem das Lockfile gehört.
Gast
Nachtrag: schau mal, obs besagten Prozess gibt, wenn nicht (oder wenns 
unwahrscheinlich ist, dass jener die uart belegt) dann töte mal das 
Lockfile (braucht vmtl. root-Rechte).
OP
Ihr seid meine absoluten Retter :-)

Vielen vielen Dank!

Den Prozess gab es nicht.

Aber das Löschen des Lockfiles hat den Erfolg gebracht :-)

Wie entsteht denn so ein Lockfile und ist dass normal, dass sowas 
passiert?



Vielen Dank nochmal :-)
Gast
> Wie entsteht denn so ein Lockfile [..]

Man legt es (absichtlich) an - hier macht das Qt :-)

> [..] und ist dass normal, dass sowas passiert?

Das Lockfile als solches: ja, ein 'stale lockfile' dagegen sollte man um 
jeden Preis vermeiden (oder (als Programm) selbst adäquat aufräumen 
können, stattdessen einen Deadlock zu produzieren ist per se ein no-go), 
weil sonst genau obiges passiert :-)
g457 schrieb:
> Das Lockfile als solches: ja, ein 'stale lockfile' dagegen sollte man um
> jeden Preis vermeiden (oder (als Programm) selbst adäquat aufräumen
> können, stattdessen einen Deadlock zu produzieren ist per se ein no-go),
> weil sonst genau obiges passiert :-)

Genau, und normalerweise vermeidet man das indem man mal schaut ob's den 
Prozess aus dem Lockfile noch gibt -- was hier aber wohl nicht passiert. 
Das wäre vielleicht sogar einen Bug Report gegen QtSerial wert?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.