PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zugriff auf serielle Steuerleitungen



StefanS
03-04-2000, 13:21
Hallo zusammen !

Ich versuche an der DTR-Leitung der seriellen Schnittstelle ein Taktsignal zu erzeugen (an-/abschalten in 10msec Intervallen).
Ich habe dazu auf das <a href="http://www.easysw.com/~mike/serial/serial.html">Serial Programming Guide for POSIX Operating Systems</a> zurückgegriffen, da das serial-programming-HOWTO sich nicht um die direkte Ansteuerung der Steuerleitungen kümmert.

Allerdings funktionieren die dort aufgeführten ioctl()-Funktionen nicht !
(z.B. <tt>ioctl(fd, TIOCMSET, TIOCM_DTR);</tt> )

Was mach ich falsch ? Oder ist Linux in dem Punkt doch nicht Posix-kompatibel (die Funktione TIOCMSET ist aber definiert) ?

Danke schonmal , ciao StefanS

thommy
03-04-2000, 13:29
Welchen Fehlercode erzeugt den ioctl(...)? Eine häufige Fehlerursache sind fehlende Zugriffsrechte auf die seriellen Schnittstellen...

thomas

StefanS
03-04-2000, 15:29
Hi thommy !

Da liegt ja gerade mein Problem: es erzeugt gar keine Fehler !
Es lässt sich kompilieren und ausführen, aber an der seriellen Schnittstelle tut sich nicht das erwünschte.
Zwar wird mit dem öffnen der Devicedatei die RTS-Leitung auf low und die DTR-Leitung auf high geschaltet, die ioctl()'s haben aber keinen Effekt, beim Schließen geht RTS wieder auf high und DTR auf low.

Merkwürdig, oder ?
Ciao , StefanS

thommy
03-04-2000, 16:00
Hmm...

Wertest Du den Rückgabewert von result = ioctl() wirklich aus?

Wenn tatsächlich result == 0 ist, dann solltest Du mal das DTR-Register nach dem Manipulieren auslesen und die Werte mit der Konstante TIOCMSET vergleichen (PS: TIOCMSET ist keine Funktion! http://www.linuxforen.de/ubb/wink.gif ).

Thomas

StefanS
04-04-2000, 11:16
Danke für deine Tips.

Klar ist TIOCMSET keine Funktion im eigendlichen Sinne, aber mittels dieser Konstante teile ich der ioctl()-Funktion doch mit, welche Funktionalität ich benötige (sub-Funktion von ioctl() ?) .

Den Rückgabewert habe ich in der Tat ausser acht gelassen. Aber DTR ist kein Register, sondern eine Steuerleitung, die entweder 1/high/on b.z.w. 0/low/off sein kann. Welchen Sinn hätte ein Vergleich mit TIOCMSET ??!
(<tt>ioctl(filedescriptor, TIOCMSET,</tt> Parameter<tt>);</tt> akzeptiert als Parameter ein Byte, von dem jedes Bit einer Steuerleitung der RS-232-seriellen-Schnittstelle zugeordnet ist.)

Ich checke mal die Rückgabewerte !

Ciao , StefanS

StefanS
04-04-2000, 20:03
Hier bin ich wieder (schon etwas weiter) :

der <tt>ioctl()</tt>-Aufruf liefert den Rückgabewert -1 (also Fehler). Gemäß der manpage von ioctl habe ich anschließend die externe Variable <tt>errno</tt> abgefragt. Sie ist gleich 14, dies entspricht der in der errno-manpage genannten Konstanten <tt>EFAULT</tt>, als Erläuterung steht dort lediglich "Bad address".
Welche Addresse bitteschön ?!

Danke schonmal und ciao , StefanS

thommy
05-04-2000, 10:15
Der Fehler besagt, dass TIOCM_DTR für den von Dir angesprochenen Dateideskriptor fd kein gültiges Argument ist.

Jetzt liegen meine Erfahrungen mit der Programmierung der seriellen Schnittstelle auch schon einige Jahre zurück, ich weiß nur noch, dass wir damals nicht auf ioctl() zurück gegriffen hatten, sondern auf Routinen wie outb. Irgendwo habe ich Unterlagen... wenn ich was finde, melde ich mich.

Thomas

StefanS
05-04-2000, 10:43
Danke für deine Mühen Thommy !

Der Ansatz über <tt>outb()</tt> ist mir auch bekannt (direkter Zugriff auf IO-Ports, die DTR-Leitung findet sich dort als zweites Bit von Basisport+6). Leider ist man dabei (für <tt>ioperm()</tt>) auf root-Rechte angewiesen, und eben dieses wollte ich durch die Nutzung der Devicedatei umgehen. Schade !

Nochmal Danke, StefanS