Verwendung des Treibers ftdi_sio.c - falsche Baudrate  (Gelesen 4186 mal)

PumpkinEater

  • Gast
Hallo zusammen,
ich habe Probleme beim Auslesen meiner WS444PC (=WS300PC). Ich verwende einen Kernel 2.4.37. Das Auslesen erfolgt über ein Perlprogramm, das das Modul ftdi_sio.c ansteuert. Dieses Modul wurde mit der Product ID der WS444PC gepatcht.

Die Initialisierung in Perl erfolgt über die Programmzeilen:

        $FTDI->close if(defined($FTDI));
        $FTDI = tie(*FTD, 'Device::SerialPort', $dev) || die "Oeffnen des Geraetes $dev: fehlgeschlagen!\n";
        $FTDI->user_msg(1);
        $FTDI->reset_error();
        my $baud      = $FTDI->baudrate(19200);
        my $dbits     = $FTDI->databits(8);
        my $parity    = $FTDI->parity('even');
        my $sbits     = $FTDI->stopbits(1);
        my $handshake = $FTDI->handshake('none');
        my $rts=$FTDI->rts_active(0);
        $FTDI->purge_all;

Wenn ich mir mit dmesg die Debuginfos anschaue, sehe ich folgendes:

ftdi_sio.c: Status only: 361o 160o
ftdi_sio.c: BREAK received
ftdi_sio.c: ftdi_ioctl cmd 0x540e
ftdi_sio.c: ftdi_ioctl arg not supported - it was 0x540e - check /usr/include/asm/ioctls.h
ftdi_sio.c: ftdi_set_termios
ftdi_sio.c: Setting CS8
ftdi_sio.c: get_ftdi_divisor - tty_get_baud_rate reports speed 9600
ftdi_sio.c: get_ftdi_divisor - Baud rate set to 9600 (divisor 0x4138) on chip FT8U232AM
ftdi_sio.c: ftdi_set_termios Turning off hardware flow control
ftdi_sio.c: ftdi_ioctl cmd 0x540d
ftdi_sio.c: ftdi_ioctl arg not supported - it was 0x540d - check /usr/include/asm/ioctls.h

Mein Verständis:
Ich initialisiere im Perlprogramm die Schnittstelle mit 19200 Baud, der Treiber meldet mir aber eine Baudrate von 9600 Baud. Dadurch kann die Wetterstation natürlich nich ausgelesen werden.
Zwischendurch hatte es komischerweise mal funktioniert. Ich sah dann auch Debug-Meldungen mit "tty_get_baud_rate reports speed 19200". Scheinbar wird die Baudrate von Perl nicht richtig an den ftdi-Treiber weitergeben. Ich kann im Quelltext des ftdi_sio.c aber auch nicht erkennen, wie die Baudrate dort übergeben wird.

Ich würde mich freuen, wenn sich jemand findet, der sich mit dem ftdi-Modul etwas auskennt und mir das Setzen der Baudrate erklären würde.
Gruß
Peter

Wetterstationen.info Forum


PumpkinEater

  • Gast
Verwendung des Treibers ftdi_sio.c - falsche Baudrate
Antwort #1 am: 10.02.2009, 17:04:46
Ich antworte mir mal selbst, vielleicht ist es ja für den ein oder anderen interessant:

Das Perl-Modul Device::SerialPort verwendet die aktuellen Terminaleinstellungen. Diese lassen sich mit "stty -F /dev/usb/tts/0 -a" abfragen. Wenn das Perl-Ausleseprogramm auf das obige Perl-Modul zugreift und eine andere Baudrate setzen will, so speichert das Perlmodul die ursprünglichen stty-Settings zwischen und stellt diese später wieder her, wenn die serielle Kommunikation beendet wurde. Die Ausgabe des dmesg-Befehls beschreibt genau dieses
Wiederherstellen. Kurzum, an der Baudrate hat's nicht gelegen, dass das Auslesen der WS nicht funktionierte und ich in den dmesg-Logs die häufigen Breaks sah.
Vielmehr mußte ich nach Laden des ftdi_sio-Treibers und vor dem Starten des Perl-Ausleseprogramms folgendes setzen:

    stty -F /dev/usb/tts/0 min 0

Vorher stand "min" auf 1. Das Modul Device::SerialPort setzt während des Auslesens den Parameter -icanon, und dann wirkt sich ein min=1 negativ aus. Eigentlich müßte man im Perlausleseprogramm alternativ auch mit einem "$FTDI->icanon(0)"  das Modul anweisen können, den Parameter -icanon nicht zu setzen. Aber das brachte nicht den Erfolg.

Falls irgendjemand das besser erklären kann, oder weitere Infos hat, würde ich mich über Feedback sehr freuen.

Gruß
 Peter