Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Zugriff auf serielle Steuerleitungen

  1. #1
    StefanS
    Gast

    Question Zugriff auf serielle Steuerleitungen

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    Welchen Fehlercode erzeugt den ioctl(...)? Eine häufige Fehlerursache sind fehlende Zugriffsrechte auf die seriellen Schnittstellen...

    thomas


  3. #3
    StefanS
    Gast

    Unhappy

    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    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! ).

    Thomas

  5. #5
    StefanS
    Gast

    Red face

    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

  6. #6
    StefanS
    Gast

    Arrow

    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    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

  8. #8
    StefanS
    Gast

    Unhappy

    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •