Forum: PC-Programmierung Linux, USB-UART, Baudrate wechseln, Verhalten von Steuerleitungen?


von (Gast) (Gast) (Gast) (Gast)


Lesenswert?

Wie sollte sich eine serielle Schnittstelle beim Wechsel der Baudrate 
verhalten?

Unter Linux tritt bei einem Baudratenwechsel via termios eines 
usbserial Adapters immer ein unerwünschter Wechsel des DTR-Signals 
auf. Ich benutze einen PL2303, das Problem tritt nach Hörensagen aber 
auch bei anderen Adapter auf. Evtl. ist es ein Problem mit USB?

http://www.mjmwired.net/kernel/Documentation/usb/usb-serial.txt

Und im Treiber:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.31.y.git;a=blob;f=drivers/usb/serial/pl2303.c;h=600097de714fb08f65447ed3e0b1182160e4b69c;hb=HEAD#l619

Leider ist das eine Nummer zu groß für mich. Wo ist B0 definiert?

von (Gast) (Gast) (Gast) (Gast)


Lesenswert?

Die manpage sagt:

The zero baud rate, B0, is used to terminate the connection.  If B0 is 
specified, the modem control lines shall no longer be  asserted. 
Normally, this will disconnect the line.

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo,

leider kann ich das nicht genau beantworten.
Mir hat jedenfalls folgender Link geholfen:

http://www.easysw.com/~mike/serial/serial.html


Gruß

Olaf

von (Gast) (Gast) (Gast) (Gast)


Lesenswert?

Kenn ich, danke trotzdem!

von DS66 (Gast)


Lesenswert?

Der "Fehler" liegt im Treiber und zwar hier
pl2303.c:

622         if ((cflag & CBAUD) == B0)
623                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
624         else
625                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
626         if (control != priv->line_control) {
627                 control = priv->line_control;
628                 spin_unlock_irqrestore(&priv->lock, flags);
629                 set_control_lines(serial->dev, control);
630         } else {
631                 spin_unlock_irqrestore(&priv->lock, flags);
632         }

Beim wechsel der Baudrate ungleich "B0" wird DTR und RTS immer auf HIGH 
gesetzt, egal, ob vorher nicht gesetzt oder gesetzt.
Du müsstest dir den Treiber ohne diese Zeilen übersetzen, dann sollte es 
funktionieren.
(hab gerade dasselbe Problem)

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.