Forum: PC Hard- und Software Linux: kann man DTR auf ttyUSBx abschalten?


von Moriz (untertaucher)


Lesenswert?

ttyUSB setzt beim Öffnen der Schnittstelle das DTR-Signal – der 
Bootlader braucht ihn, weil er nur nach einem Hard-Reset die Kontrolle 
bekommt.

Allerdings ist DTR für ein laufendes Programm auf dem Arduino "tödlich".

Kann man gtkterm irgendwie beibringen, beim Start DTR nicht zu setzen?

von Norbert (der_norbert)


Lesenswert?

man stty
1
Control settings:
2
   [-]clocal    disable modem control signals

von C-hater (c-hater)


Lesenswert?

Norbert schrieb:
> man stty
>
1
Control settings:
2
>    [-]clocal    disable modem control signals
3
>

Damit ist dann allerdings dauerhaft der Zugriff auf beide 
Steuerleitungen der Schnittstelle gesperrt. Und es werden dann wohl auch 
die die vier Feedback-Leitungen nicht mehr ausgewertet.

Wenn das nicht akzeptabel ist, kommt man nicht darum herum, sich den 
ganzen Wahnsinn der termio-Konfigurationen anzutun, um das gewünschte 
Ziel zu erreichen.

Mein Gott, wie liebe ich Windows im Allgemeinen und .net im Speziellen. 
Da ist das mit einem simplen
<PortInstance>.DtrEnable = false;
abgehandelt...

Das ist wahrer Programmier-Komfort.

von C-hater (c-hater)


Lesenswert?

C-hater schrieb:

> Das ist wahrer Programmier-Komfort.

Fast vergessen: Das funktioniert auch mit mono unter Linux.

von Norbert (der_norbert)


Lesenswert?

C-hater schrieb:
> Wenn das nicht akzeptabel ist, kommt man nicht darum herum, sich den
> ganzen Wahnsinn der termio-Konfigurationen anzutun, um das gewünschte
> Ziel zu erreichen.

Na ja, erstens und zweitens ist das nun wirklich keine 
Raketenwissenschaft. Drittens und viertens nimmt der ganz besonders 
bequeme Mensch vermutlich sogar eine zu seiner Programmiersprache 
passende Bibliothek. Oder installiert sich auf einer wenige Exabyte 
großen Festplatte Mono/Stereo oder gar Quadro.

von Alexander S. (alesi)


Lesenswert?

Moriz schrieb:
> Kann man gtkterm irgendwie beibringen, beim Start DTR nicht zu setzen?

Bei minicom kann man die DTR drop-time auf 0 setzen (kein DTR).
Configure minicom -> Modem and dialing

Ob das unter gtkterm auch geht, kann ich nicht sagen.

von C-hater (c-hater)


Lesenswert?

Norbert schrieb:

> Na ja, erstens und zweitens ist das nun wirklich keine
> Raketenwissenschaft.

Nein, sicher nicht. Aber doch recht schwierig zu durchschauen. Das ist 
nur eine Auswirkung dessen, dass man mittlerweile grandios historische 
Sachen unbedingt am Leben erhalten will. Allein die Tatsache, das es die 
termio-Struktur mittlerweile in drei Versionen gibt, zeigt das.

Das ist Mist. Da haben die Schnittstellen-Designer massiv geschlampt. 
Nun ist allerdings ja nicht so, dass es unter Win32 nicht auch immer mal 
wieder Struktur-Updates und *Ex-Funktionen gibt. Aber da reicht es dann, 
immer die neueste Version und Struktur zu verwenden, um alles tun zu 
können. Da ist es NIEMALS nötig, sich mit einem Mischmasch 
rumzuschlagen. Sprich: Die KÖNNEN Abwarts-Kompatibilität. Linux kann 
das nachweisbar nicht. Ganz sicher jedenfalls nicht, was diese 
vermaledeite termio-Sache betrifft.

Und nun du...

von Rolf M. (rmagnus)


Lesenswert?

C-hater schrieb:
> Mein Gott, wie liebe ich Windows im Allgemeinen und .net im Speziellen.
> Da ist das mit einem simplen
> <PortInstance>.DtrEnable = false;
> abgehandelt...

Das liegt aber weniger an Windows als an der API. Das Windows-Pendant zu 
termios ist eher das:
https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommstate

> Fast vergessen: Das funktioniert auch mit mono unter Linux.

Mit Qt auch. Da heißt die Funktion setDataTerminalReady().

von Norbert (der_norbert)


Lesenswert?

C-hater schrieb:
> Und nun du...

Nö, ich bin Pragmatiker. ›Man pages‹ lesen, dann wird das einmal kurz 
programmiert und gut iss. Ganz ohne innere Verspannung…

von Moriz (untertaucher)


Lesenswert?

Gibts dafür unter Linux tatsächlich kein Programm, mit dem man das 
meinetwegen aus einem Skript heraus vor dem gtkterm-Aufruf erledigen 
kann?

Eigentlich wäre doch stty der Kandidat dafür, aber der scheitert schon, 
wenn das Gerät am anderen Ende der Leitung noch nicht aktiv ist, weil 
dann /dev/ttyUSB0 – oder welche Nummer auch immer – nicht existiert.

Dass die Nummern bei mehreren angeschlossenen Geräten von der 
Reihenfolge des Anschlusses abhängen, ist ja auch noch so ein Unding. 
Das gibts wohl nur bei USB…

von Frank K. (fchk)


Lesenswert?

Moriz schrieb:

> Dass die Nummern bei mehreren angeschlossenen Geräten von der
> Reihenfolge des Anschlusses abhängen, ist ja auch noch so ein Unding.
> Das gibts wohl nur bei USB…

... wenn DU dafür keine udev-Regeln geschrieben hast und so dumm warst, 
Adapter ohne eingebaute eindeutige Seriennummern zu kaufen.

fchk

von Moriz (untertaucher)


Lesenswert?

Frank K. schrieb:
> ... wenn DU dafür keine udev-Regeln geschrieben hast und so dumm warst,
> Adapter ohne eingebaute eindeutige Seriennummern zu kaufen.

Danke für die Blumen…

Wie komme ich an die Seriennummer eines Arduino Nano?

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Moriz schrieb:
> Wie komme ich an die Seriennummer eines Arduino Nano?
dmesg -c
Arduino Anstecken
dmesg

von Moriz (untertaucher)


Lesenswert?

Aha. Aber es bleibt ein Schrott: ein Arduino Nano ist nicht gerade ein 
Teil, das man in der udev-DB verdrahten will – dazu fliegen einfach zu 
viele davon in der Bastelecke herum.

von Manfred P. (pruckelfred)


Lesenswert?

Moriz schrieb:
> Wie komme ich an die Seriennummer eines Arduino Nano?

Wenn es ein Chinese ist, garnicht, die CH340 haben keine Seriennummer.

Das gefällt mir als Windows-Nutzer sehr gut: Jeder hat die gleiche 
Portnummer, solange ich ihn an den selben PC-Port stecke. FTDI oder 
SiLab mit Seriennummer zählen unter Windows den Port hoch, bis es nicht 
mehr reicht - so hat also jedes Ding zwei Seiten.

Was passiert denn unter Linux, wenn Du einen anderen Nano an den _selben 
Port_ steckst, sollte da nicht auch die Nummer gleich bleiben?

von Moriz (untertaucher)


Lesenswert?

Manfred P. schrieb:
> Was passiert denn unter Linux, wenn Du einen anderen Nano an den _selben
> Port_ steckst, sollte da nicht auch die Nummer gleich bleiben?

Linux nimmt die erste freie Nummer und erzeugt damit ein /dev/ttyUSBn.

Wenn man keine weiteren seriellen Geräte am USB hat, dann bekommt der 
immer die ttyUSB0. (Früher wurden die Devices nach dem Verbindungsabbau 
nicht so schnell freigegeben und so bekam man auch mal ttyUSB1, wenn 
ttyUSB0 noch da war.)

Das Problem bei der Geschichte ist eben, dass die ttyUSBs verschwinden, 
wenn keine Verbindung mehr besteht und so kann stty auch keine 
Einstellungen vornehmen.

von Ein T. (ein_typ)


Lesenswert?

Moriz schrieb:
> Linux nimmt die erste freie Nummer und erzeugt damit ein /dev/ttyUSBn.
>
> Wenn man keine weiteren seriellen Geräte am USB hat, dann bekommt der
> immer die ttyUSB0. (Früher wurden die Devices nach dem Verbindungsabbau
> nicht so schnell freigegeben und so bekam man auch mal ttyUSB1, wenn
> ttyUSB0 noch da war.)
>
> Das Problem bei der Geschichte ist eben, dass die ttyUSBs verschwinden,
> wenn keine Verbindung mehr besteht und so kann stty auch keine
> Einstellungen vornehmen.

IIRC können udev-Regeln beim Einstöpseln Skripte aufrufen.

von Norbert (der_norbert)


Lesenswert?

Ein T. schrieb:
> IIRC können udev-Regeln beim Einstöpseln Skripte aufrufen.

Ganz genau so ist es!
Und das machen sie zB. mit:
1
RUN+="/etc/udev/rules.d/device.run"

von Rolf M. (rmagnus)


Lesenswert?

Moriz schrieb:
> Eigentlich wäre doch stty der Kandidat dafür, aber der scheitert schon,
> wenn das Gerät am anderen Ende der Leitung noch nicht aktiv ist, weil
> dann /dev/ttyUSB0 – oder welche Nummer auch immer – nicht existiert.

Du erwartest von einem Programm, dass du damit die Parameter eines noch 
gar nicht existierenden Device einstellen kannst?

Moriz schrieb:
> Aha. Aber es bleibt ein Schrott: ein Arduino Nano ist nicht gerade ein
> Teil, das man in der udev-DB verdrahten will – dazu fliegen einfach zu
> viele davon in der Bastelecke herum.

Du musst dich jetzt schon entscheiden. Entweder werden die Namen der 
Geräte nach der Reihenfolge des Einsteckens gewählt oder jedes bekommt 
einen festen Namen. Beides findest du "Mist", also wie willst du es denn 
nun haben?

Moriz schrieb:
> Das Problem bei der Geschichte ist eben, dass die ttyUSBs verschwinden,
> wenn keine Verbindung mehr besteht und so kann stty auch keine
> Einstellungen vornehmen.

Wenn nichts da ist, gibt's ja auch nichts, das man einstellen könnte.

von Daniel A. (daniel-a)


Lesenswert?

C-hater schrieb:
> C-hater schrieb:
>> Das ist wahrer Programmier-Komfort.
>
> Fast vergessen: Das funktioniert auch mit mono unter Linux.

Microsoft will das doch auch schon wieder ersetzen, und drehen mal 
wieder ihre eigene Runtime ( 
https://learn.microsoft.com/de-de/dotnet/core/install/linux-debian ).

Ausprobiert habe ich das nicht, ich lade mir solchen Scheiss nicht auf 
den Rechner.

von Daniel A. (daniel-a)


Lesenswert?

Rolf M. schrieb:
> Entweder werden die Namen der
> Geräte nach der Reihenfolge des Einsteckens gewählt oder jedes bekommt
> einen festen Namen.

Man kann mit udev auch symlinks machen, wie bei /dev/disk/by-*/. Mach 
dir halt einen symlink alla /dev/ttyUSB-1.2.3 -> /dev/ttyUSB0 oder so 
mit den Portnummern hinten dran.

Edit, ich habe das jetzt nicht ausprobiert, aber eventuell irgendwie so:
1
# %p oder $devpath oder $attr{devpath}
2
KERNEL=="ttyUSB?", SUBSYSTEMS=="usb", SYMLINK+="ttyUSB-%p"

: Bearbeitet durch User
von Moriz (untertaucher)


Lesenswert?

Ein T. schrieb:
> IIRC können udev-Regeln beim Einstöpseln Skripte aufrufen.

Und wie willst du es anstellen, dass der Bootlader das DTR bekommt, das 
er braucht, aber im Terminal-Betrieb DTR unterdrückt wird?

von Moriz (untertaucher)


Lesenswert?

Rolf M. schrieb:
> Du erwartest von einem Programm, dass du damit die Parameter eines noch
> gar nicht existierenden Device einstellen kannst?

Du Schlaumeier… Dass es das Device nicht gibt, oder es an eine bestimmte 
Geräte-ID gebunden ist, die der Nano nicht hat, ist das Problem.

Da muss ich c-hater in Beziehung zu Windows mal ausnahmsweise Recht 
geben – wenigstens das haben die so gebacken bekommen, dass es 
praxistauglich ist.

> Wenn nichts da ist, gibt's ja auch nichts, das man einstellen könnte.

Ach, und wie macht Windows das dann?

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

Mal so ganz nebenbei gefragt: Was für ein ominöser  Bootloader soll das 
denn sein?

WIMRE macht das Arduino Zeug die Schnittstelle mit 1200bd auf und sofort 
wieder zu. Dann im Anschluss mit - ich meine - 115200bd und so erkennt's 
der Bootlader und meldet sich.

Wenn diese Abfolge nicht eingehalten wird geht's sofort in die 
eigentliche Applikation.

PS. Ein DTR (Data Terminal Ready) ist ein völlig normales Signal und 
sollte für die Arduino-Applikation alles aber ganz bestimmt nicht

> tödlich

sein.

von Moriz (untertaucher)


Lesenswert?

Norbert schrieb:
> Mal so ganz nebenbei gefragt: Was für ein ominöser  Bootloader soll das
> denn sein?

Der vom Arduino – Nano in dem Fall.

> WIMRE macht das Arduino Zeug die Schnittstelle mit 1200bd auf und sofort
> wieder zu. Dann im Anschluss mit - ich meine - 115200bd und so erkennt's
> der Bootlader und meldet sich.

Nein, der Nano macht das sehr trickreich, indem er aus dem 
Zustandswechsel von DTR einen Reset-Puls ableitet. Der Bootlader erkennt 
den Reset und wartet auf den Verbindungsaufbau. Wie der Boot ausgelöst 
wurde, ist dem MCUSR zu entnehmen.

> PS. Ein DTR (Data Terminal Ready) ist ein völlig normales Signal und
> sollte für die Arduino-Applikation alles aber ganz bestimmt nicht
>
>> tödlich
>
> sein.

Ist es aber, weil durch DTR eben ein Reset ausgelöst wird…

von Norbert (der_norbert)


Lesenswert?

Moriz schrieb:
> Nein, der Nano macht das sehr trickreich, indem er aus dem
> Zustandswechsel von DTR einen Reset-Puls ableitet.

Na ja, ›trickreich‹ wäre jetzt der letzte Begriff der mir dabei 
einfiele.

Moriz schrieb:
> Ist es aber, weil durch DTR eben ein Reset ausgelöst wird…

OK, scheint als wenn das Ding von echten Profis entwickelt wurde…

von Moriz (untertaucher)


Lesenswert?

Norbert schrieb:
> OK, scheint als wenn das Ding von echten Profis entwickelt wurde…

Die Alternative wäre Handanlegen, um den Bootlader zu aktivieren – bei 
BT-Übertragung mit den üblichen kleinen Adapterplatinchen bleibt da 
nichts anderes, weil die DTR nicht übertragen.

So ist das schon einigermaßen komfortabel, hat aber eben die genannte 
Schattenseite…

von Norbert (der_norbert)


Lesenswert?

Moriz schrieb:
> Die Alternative wäre Handanlegen, um den Bootlader zu aktivieren

Die vollautomatische Alternative ohne Krücken hatte ich bereits 
beschrieben.

von Moriz (untertaucher)


Lesenswert?

Norbert schrieb:
> Die vollautomatische Alternative ohne Krücken hatte ich bereits
> beschrieben.

Das kostet Platz im Bootlader und würde wohl heißen, dass der eine Seite 
mehr belegt, denn er ist im Moment gerade so groß, dass er mit einer 
auskommt.

: Bearbeitet durch User
von Moriz (untertaucher)


Lesenswert?

Alexander S. schrieb:
> Bei minicom kann man die DTR drop-time auf 0 setzen (kein DTR).
> Configure minicom -> Modem and dialing

Wie bekommt man es hin, das Setup zu speichern?
Bei endet Save setup as dfl mit "Cannot write to 
/etc/minicom/minirc.dfl".
Das Teil als root auszuführen ist wohl nicht das Mittel der Wahl…

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Einfach mal die manpage lesen könnte schon etwas Aufschluss geben...

https://www.man7.org/linux/man-pages/man1/minicom.1.html
1
-s, --setup
2
            Setup.  Root edits the system-wide defaults in
3
            /etc/minirc.dfl with this option.  When it is used, minicom
4
            does not initialize, but puts you directly into the
5
            configuration menu. This is very handy if minicom refuses to
6
            start up because your system has changed, or for the first
7
            time you run minicom. For most systems, reasonable defaults
8
            are already compiled in.
9
10
configuration
11
            The configuration argument is more interesting. Normally,
12
            minicom gets its defaults from a file called "minirc.dfl".
13
            If you however give an argument to minicom, it will try to
14
            get its defaults from a file called "minirc.configuration".
15
            So it is possible to create multiple configuration files,
16
            for different ports, different users etc. Most sensible is
17
            to use device names, such as tty1, tty64, sio2 etc. If a
18
            user creates his own configuration file, it will show up in
19
            his home directory as ".minirc.dfl" or
20
            ".minirc.configuration".
21
22
Save setup as dfl
23
         Save the parameters as the default for the next time the
24
         program is started. Instead of dfl, any other parameter name
25
         may appear, depending on which one was used when the program
26
         was started.
27
28
Save setup as..
29
         Save the parameters under a special name. Whenever Minicom is
30
         started with this name as an argument, it will use these
31
         parameters. This option is of course privileged to root.
32
33
FILES    
34
       Minicom keeps it's configuration files in one directory, usually
35
       /var/lib/minicom, /usr/local/etc or /etc. To find out what
36
       default directory minicom has compiled in, issue the command
37
       minicom -h.

oder mal hier gucken:
https://cris.bytesnblades.net/2009/03/24/managing-minicom-settings/

: Bearbeitet durch User
von Moriz (untertaucher)


Lesenswert?

Das Teil ist gewöhnungsbedürftig… Aber DTR abstellen, funktioniert.

Ich würde gerne ein log mitschreiben und habe den Logfile Path auf 
/tmp/minicom.log gesetzt. Ein Log wird nicht geschrieben – es scheint 
auf ~/<dateiname> zu bestehen.

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.