FT232RL funktioniert nur halb unter Linux (Ubuntu)

#3839976
Lesenswert?

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);
#3840072
Lesenswert?

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 #3840077
Lesenswert?

> 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).
#3840084
Lesenswert?

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. :-(
#3840128
Lesenswert?

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 #3840134
Lesenswert?

> 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 #3840159
Lesenswert?

> 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 :-)
#3840212
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren