Forum: PC Hard- und Software ttyUSB* versagt bei Kommunikation an FT232RL


von Andreas S. (hebbatz)


Lesenswert?

Guten Morgen zusammen,

ich hoffe hier kann mir einer mit folgendem Problem weiterhelfen:

Also ich habe einen ATmega168 der hinter einem FT232RL sitzt. Der 
Controller steuert ein Lasermodul. Dieses möchte ich an und ausschalten 
können. Dazu sende ich ein Paket mit 6 Bytes. Das ganze klappt auch 
wunderbar unter Windows mit HTerm. Ich arbeite aber unter Linux.

Ich habe nun mal meine Ports unter Linux mit einem Nullmodemkabel 
getestet und hatte keine Probleme. Sobald ich aber versuche mittels 
gtkterm oder ähnlichen Programmen Daten an die USB-Seriell Schnittstelle 
zu senden passiert nichts.
Gtkterm gibt "Control signals read: Bad Address" aus. Port stimmt aber 
auf jeden Fall.

Da es unter Windows klappt und meine Ports funktionieren, bin ich zu dem 
Schluss gekommen, dass es ein Problem mit dem FT232RL unter Linux gibt.

Hatte vielleicht schonmal jemand ein ähnliches Problem?

Danke und Grüße,

Andreas

von Markus (Gast)


Lesenswert?

Bei mir funktioniert der FT232 unter Linux problemlos. Natürlich braucht 
man das passende Kernelmodul.
Gib mal "dmesg" auf der Konsole ein und überprüfe, ob der FT232 korrekt 
eingebunden wurde (bei den meisten Distributionen als /dev/ttyUSB0).

Viele Grüße
Markus

von Andreas S. (hebbatz)


Lesenswert?

Hallo Markus,

also dmsg |grep FTDI gibt mir aus, "FTDI USB Serial Device converter is 
now attached to ttyUSB0".
Sieht alles ganz gut aus. Zusätzliche Kernelmodule musste ich nicht 
laden.

Ich verstehe das auch nicht so ganz. Es ist auch kein Rechte Problem, da 
ich natürlich in der Gruppe dialout eingetragen bin. Hast du vielleicht 
noch irgendwas anderes geladen oder angepasst bevor der FT232RL bei dir 
problemlos lief?

Viele Grüße,

Andreas

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Solange Du in Deinem Controller kein Terminal emulierst wird es Dir 
wenig bringen, das zu versuchen.

libftdi benutzen...

von yalu (Gast)


Lesenswert?

> Ich habe nun mal meine Ports unter Linux mit einem Nullmodemkabel
> getestet und hatte keine Probleme.

Den ttyUSB0 oder andere Ports (z.B. ttyS0?

Auszug aus /man errno/:

       EFAULT          Bad address (POSIX.1)

Read lieferte also einen EFAULT.

Auszug aus /man 2 read/:

       ssize_t read(int fd, void *buf, size_t count);
       ...
       EFAULT buf is outside your accessible address space.

Das sieht zunächst nach einem Bug in GTKTerm aus. Da Google zu
'gtkterm "bad address"' sonst so gut wie nichts liefert, liegt der
Fehler aber eher woanders.

Was passiert, bei

  cat /dev/ttyUSB0

?

von Andreas S. (hebbatz)


Lesenswert?

Hallo und Danke für euere Hilfe,

> Den ttyUSB0 oder andere Ports (z.B. ttyS0?

Also ich habe meinen Laptop über einen zweiten USB/Seriel Wandler 
mittels Nullmodemkabel an meinen Desktop angeschlossen (Laptop: ttyUSB1 
und Desktop ttyS0). Mittels cat kann ich dadurch zwischen den beiden 
kommunizieren. Es klappt auch mittels minicom, cutecom oder picocom, 
aber halt nicht zum FTDI.

Bei cat /dev/ttyUSB0 (also die Verbindung zum FTDI) gibt es keinen 
Fehler. Er wartet halt auf Daten vom FTDI. Da kommt aber nix.

libftdi ist installiert. Der Controller schaut einfach nur, ob die 
ersten beiden Startbytes 0xFF sind, ob die darauf folgenden 3 Datenbytes 
passen, und ob die Checksum stimmt. Es klappt ja auch unter Windows. 
Somit sollte es doch auch unter Linux klappen, so lange das Protokoll 
stimmt. Wie ich nun ein Terminal im Controller emuliere ist mir im 
Moment nicht so ganz klar.

Grüße,

Andreas

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Andreas Schmidt wrote:

> libftdi ist installiert.

Tolle Sache. Wenn Du jetzt auch noch eine korrekte Applikation zum 
Zugriff auf den FTDI damit schreibst klappt die Sache.

von Andreas S. (hebbatz)


Lesenswert?

> Tolle Sache. Wenn Du jetzt auch noch eine korrekte Applikation zum
> Zugriff auf den FTDI damit schreibst klappt die Sache.

Hmmm...das klappt bestimmt, aber müsste ich auf die simulierte serielle 
Schnittstelle nicht auch einfach duch /dev/ttyUSB* zugreifen können?

Ist es nicht möglich einfach nur durch die libserial Biliothek (oder 
halt einfach durch einen write(...) in C++, wenn die 
Verbindungsparameter eingestellt sind ) die Ansteuerung hinzubekommen?

Und sollte es nicht auch mittel gtkterm oder ähnlichen Programmen 
klappen auf den FTDI zu zugreifen ohne die libftdi? Diese wird ja zum 
kompilieren der Programme nicht benötigt.

Grüße,

Andreas

von yalu (Gast)


Lesenswert?

Wenn 'cat /dev/ttyUSB0' keinen Fehler ausgibt, scheint Treiber- und
rechtemäßig alles in Ordnung zu sein. Die libftdi brauchst du nicht,
wenn du den FTDI nur als gewöhnlichen USB-Seriell-Konverter über das
ttyUSB0-Device benutzt. Vergiss sie für den Moment einfach. Natürlich
schadet die bloße Installation dieser Bibliothek nicht.

Bist du sicher, dass der Controller gar nichts empfängt, oder empfängt
er möglicherweise nur falsche Daten? Du kannst ja das
Controllerprogramm zu Testzewecken den Ausgang immer dann schalten
lassen, wenn es irgendein Byte empfängt.

Nur der Vollständigkeit halber: Ist die Baudrate auf beiden Seiten auf
den gleichen Wert eingestellt?

Sind Hardware- und Software-Handshake deaktiviert? Wenn nicht, wird
möglicherweise auf dem PC das Senden blockiert.

Du kannst auch einmal die andere Richtung testen: Lass den Controller
periodisch irgendwelche Zeichen ausgeben und schau nach, ob sie am PC
ankommen.

Oder du sorgst dafür, dass der Controller sein TXD inaktiv hält (TXD
nicht aktivieren und nicht auf Ausgangschalten), und verbindest RXD
und TXD-Pin des FTDI (als Loopback). Dann müssten, unabhängig von der
Baudrate, alle Daten, die du mit

  echo Hallo >/dev/ttyUSB0

sendest, mit

  cat /dev/ttyUSB0

sofort wieder empfangen können.

Wenn das GTKTerm Zicken macht, kannst du es auch mit Minicom
versuchen.

von Klaus (Gast)


Lesenswert?

Hallo Andreas,

es ist vermutlich das Paket "brltty" installiert, um den FTDI Chip
nutzen zu können musst Du das Paket "brltty" vollständig deinstallieren.

Wenn Du über die libftdi bzw. libusb auf den Chip zugreifst ist es egal
ob "brltty" installiert ist oder nicht.

Schau mal ob das Kernel Modul geladen wurde:
  lsmod | grep ftdi_sio

wenn nicht das Modul per Hand laden:
  modprobe ftdi_sio

dann sollte es schon gehen :-)

Grüße
Klaus

von Andreas S. (hebbatz)


Lesenswert?

> es ist vermutlich das Paket "brltty" installiert, um den FTDI Chip
> nutzen zu können musst Du das Paket "brltty" vollständig deinstallieren.

> Wenn Du über die libftdi bzw. libusb auf den Chip zugreifst ist es egal
> ob "brltty" installiert ist oder nicht.

> Schau mal ob das Kernel Modul geladen wurde:
>  lsmod | grep ftdi_sio

> wenn nicht das Modul per Hand laden:
>  modprobe ftdi_sio

Leider ist keines davon das Problem. "brltty" ist von Anfang an 
deinstalliert gewesen und das Kernel Modul ist auch geladen. Trotzdem 
Danke.

Baudrate ist auch richtig eingestellt gewesen. Ich werde nun mal yalu's 
Vorschlag verfolgen.

Ich denke in der Tat, dass am Controller einfach nur Müll ankommt und 
deswegen das alles nicht funktioniert. Werde dem mal nachgehen. Warum 
GtkTerm nicht klappt weiß ich auch nicht.

Danke euch allen.

Grüße,

Andreas

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Haeng doch mal den Programmcode des Controllers an und einen Schaltplan, 
sonst kann man hier doch endlos herumraten.

von Sven K. (svenk)


Lesenswert?

Ohne die Details zu kennen, tippe ich darauf,
das die Bytes die ankommen, falsch interpretiert werden.

Mögliches Zeilenende / Zeilenvorschub fehlt oder
wird im Atmel nicht richtig verarbeitet.

Gruß Sven

von Andreas S. (hebbatz)


Lesenswert?

So ich habe nun endlich meinen Fehler gefunden. Ein ziemlich blöder 
zwar, aber von nun an werd ich das nicht mehr vergessen. Ich hate im c++ 
Code immer das CR / LF nicht mit übertragen. So konnte es ja nicht 
gehen.

Somit vielen, vielen Dank an svenk, der mich auf die richtige Fährte 
gebracht hat, aber auch an alle anderen vielen Dank.

Hier noch mein Codeschnipsel, falls jemand anderes mal vor dem selben 
Problem steht. 0xd 0x2f 0xa enspricht dem CR / LF.
1
std::string strLaserOn  = "on";
2
std::string strLaserOff = "off";
3
4
5
 if(strcmp(argv[1], strLaserOn.c_str()) == 0)
6
 {
7
   std::cerr << "LaserOn" << std::endl;
8
   const char buf[9] = {0xFF , 0xFF , 0xFF, 0x00, 0x00 , 0xFF, 0xd, 
9
                        0x2f, 0xa };
10
11
               for(int i = 0; i< sizeof(buf); i++)
12
               {
13
                       serial_port.write( &buf[i], 1 ) ;
14
               }
15
 }
16
 else if(strcmp(argv[1], strLaserOff.c_str()) == 0)
17
 {
18
   std::cerr << "LaserOff" << std::endl;
19
   const char buf[9] = {0xFF , 0xFF , 0x00, 0xFF, 0xFF , 0x00, 0xd,
20
                        0x2f, 0xa };
21
22
               for(int i = 0; i< sizeof(buf); i++)
23
               {
24
                       serial_port.write( &buf[i], 1 ) ;
25
               }
26
 }

Grüße,

Andreas

von MoritzS (Gast)


Lesenswert?

...nur fürs Archiv: Der Tipp von Klaus, "brltty" zu entfernen, hat bei 
mir zur Lösung geführt. Nach dem Einstecken von einem FT232RL Chip 
erschien kurz die /dev/ttyUSB0, verschwand dann aber sofort wieder. 
dmesg sagte:
"[27887.308000] usb 2-1: usbfs: interface 0 claimed by ftdi_sio while 
'brltty' sets config #1"
Nach dem Deinstallieren von "brltty" blieb die /dev/ttyUSB0 bestehen.

Gruß, MoritzS
(Ubuntu 7.10, 2.6.22-15)

von baalschemtov (Gast)


Lesenswert?

hallo!

es ist mir klar, dass meine frage ttyUSB* zum Novatel Ovation nicht hier 
her gehört, trotzdem kann ich eine große portion hilfe gut vertragen. 
Ich arbeite mit ubuntu linux 9.04; vor kurzem habe ich mir ein hspu 
modem von novatel erstanden. dies jedoch will nicht funktionieren. wenn 
ich dmesg eingebe, bekomme ich folgende meldung:
[  283.636772] wlan0: associated
[  283.639174] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[  294.260062] wlan0: no IPv6 routers present
[ 1419.876123] usb 3-1: new full speed USB device using uhci_hcd and 
address 2
[ 1420.040374] usb 3-1: configuration #1 chosen from 1 choice
[ 1420.115173] Initializing USB Mass Storage driver...
[ 1420.116477] scsi4 : SCSI emulation for USB Mass Storage devices
[ 1420.116849] usbcore: registered new interface driver usb-storage
[ 1420.116939] USB Mass Storage support registered.
[ 1420.117316] usb-storage: device found at 2
[ 1420.117321] usb-storage: waiting for device to settle before scanning
[ 1420.159448] usbcore: registered new interface driver usbserial
[ 1420.159484] USB Serial support registered for generic
[ 1420.159601] usbcore: registered new interface driver 
usbserial_generic
[ 1420.159606] usbserial: USB Serial Driver core
[ 1420.202234] USB Serial support registered for GSM modem (1-port)
[ 1420.202442] usbcore: registered new interface driver option
[ 1420.202447] option: v0.7.2:USB Driver for GSM modems
[ 1425.117300] usb-storage: device scan complete
[ 1425.120423] scsi 4:0:0:0: CD-ROM            Novatel  Mass Storage 
1.00 PQ: 0 ANSI: 2
[ 1425.153191] sr0: scsi-1 drive
[ 1425.153199] Uniform CD-ROM driver Revision: 3.20
[ 1425.154658] sr 4:0:0:0: Attached scsi CD-ROM sr0
[ 1425.158205] sr 4:0:0:0: Attached scsi generic sg1 type 5
[ 1425.398195] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1425.398225] sr: Sense Key : No Sense [current]
[ 1425.398234] sr: Add. Sense: No additional sense information
[ 1425.464203] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1425.464229] sr: Sense Key : No Sense [current]
[ 1425.464237] sr: Add. Sense: No additional sense information
[ 1426.266196] sr 4:0:0:0: [sr0] Media Changed
[ 1426.266204] sr 4:0:0:0: [sr0] Result: hostbyte=DID_OK 
driverbyte=DRIVER_SENSE
[ 1426.266213] sr 4:0:0:0: [sr0] Sense Key : Unit Attention [current]
[ 1426.266224] sr 4:0:0:0: [sr0] Add. Sense: No additional sense 
information
[ 1426.266236] end_request: I/O error, dev sr0, sector 2096896
[ 1426.266245] __ratelimit: 3 callbacks suppressed
[ 1426.266251] Buffer I/O error on device sr0, logical block 2096896
[ 1426.266259] Buffer I/O error on device sr0, logical block 2096897
[ 1426.266265] Buffer I/O error on device sr0, logical block 2096898
[ 1426.266272] Buffer I/O error on device sr0, logical block 2096899
[ 1426.266278] Buffer I/O error on device sr0, logical block 2096900
[ 1426.266284] Buffer I/O error on device sr0, logical block 2096901
[ 1426.266291] Buffer I/O error on device sr0, logical block 2096902
[ 1426.266297] Buffer I/O error on device sr0, logical block 2096903
[ 1426.275207] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.275216] sr: Sense Key : No Sense [current]
[ 1426.275219] sr: Add. Sense: No additional sense information
[ 1426.461158] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.461168] sr: Sense Key : No Sense [current]
[ 1426.461172] sr: Add. Sense: No additional sense information
[ 1426.672197] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.672226] sr: Sense Key : No Sense [current]
[ 1426.672235] sr: Add. Sense: No additional sense information
[ 1426.681234] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 28 00 00 00 00 10 00
[ 1426.681258] sr: Sense Key : No Sense [current]
[ 1426.681266] sr: Add. Sense: No additional sense information
[ 1426.690214] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 20 00 00 00 00 18 00
[ 1426.690241] sr: Sense Key : No Sense [current]
[ 1426.690251] sr: Add. Sense: No additional sense information
[ 1426.729211] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.729240] sr: Sense Key : No Sense [current]
[ 1426.729249] sr: Add. Sense: No additional sense information
[ 1426.834195] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.834220] sr: Sense Key : No Sense [current]
[ 1426.834229] sr: Add. Sense: No additional sense information
[ 1426.843235] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 28 00 00 00 00 10 00
[ 1426.843259] sr: Sense Key : No Sense [current]
[ 1426.843267] sr: Add. Sense: No additional sense information
[ 1426.852223] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 20 00 00 00 00 18 00
[ 1426.852247] sr: Sense Key : No Sense [current]
[ 1426.852255] sr: Add. Sense: No additional sense information
[ 1426.893189] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.893217] sr: Sense Key : No Sense [current]
[ 1426.893226] sr: Add. Sense: No additional sense information
[ 1426.922201] UDF-fs: No VRS found
[ 1426.922207] UDF-fs: No partition found (1)
[ 1426.952223] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1426.952248] sr: Sense Key : No Sense [current]
[ 1426.952256] sr: Add. Sense: No additional sense information
[ 1426.954223] ISO 9660 Extensions: Microsoft Joliet Level 1
[ 1426.959190] ISO 9660 Extensions: IEEE_P1282
[ 1427.040166] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1427.040175] sr: Sense Key : No Sense [current]
[ 1427.040178] sr: Add. Sense: No additional sense information
[ 1427.275162] sr0: CDROM (ioctl) error, command: Get configuration 46 
00 00 00 00 00 00 00 20 00
[ 1427.275173] sr: Sense Key : No Sense [current]
[ 1427.275176] sr: Add. Sense: No additional sense information

danke für die hilfe

von faustian (Gast)


Lesenswert?

Zum Modem: versuch mal "eject sr0".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.