Deaktivieren Sie DTR auf ttyUSB0

11

Ich verbinde mich von Pi mit dem Arduino-Klon-Board. Das Problem ist, dass ich die DTR-Leitung deaktivieren muss, um zu verhindern, dass Arduino beim Verbinden zurückgesetzt wird.

Ich habe gelesen, dass es bei RPi nicht möglich ist, DTR, DCD und andere Leitungen zu steuern. Gilt dies für RPi weltweit oder nur für GPIO-Pins, die für die serielle Kommunikation verwendet werden?

Wie können Sie DTR am USB-Anschluss deaktivieren, wenn dies möglich ist?

jnovacho
quelle

Antworten:

6

Die Eigenschaften eines seriellen USB-Konverters haben nichts mit der Hardware des Hosting-Systems zu tun, sondern nur mit dem seriellen USB-Chip selbst und dem Software-Stack des Hosting-Systems.

Der Pi sollte serienmäßige serielle Linux USB USB-Treiber verwenden.

Daher können Sie die Verknüpfung von DTR zum Öffnen / Schließen von Ports über die übliche Linux-Methode zum Löschen der hupclEinstellungen aktivieren / deaktivieren , wie auf der Arduino-Site und anderswo dokumentiert:

stty -F /dev/ttyUSB0 -hupcl

Oder Sie ersetzen / dev / ttyUSB0 durch eine Gerätedatei, die tatsächlich Ihrem seriellen USB-Anschluss entspricht (z. B. wäre die erste Uno-Verbindung wahrscheinlich / dev / ttyACM0).

Selbst in Bezug auf die native serielle Schnittstelle des PI unterliegt dieses Verhalten von DTR letztendlich der Softwarekontrolle - jeder, der etwas anderes argumentiert, ignoriert die Tatsache, dass nur der Linux-Treiber und nicht die Hardware Kenntnis von der Schnittstelle hat geöffnet oder geschlossen. Die eigentliche Port-Hardware kann nur erkennen, dass sie gelesen oder in sie geschrieben oder neu konfiguriert wird. Keines davon ist gleichbedeutend mit dem Öffnen des seriellen Geräts.

Chris Stratton
quelle
Funktioniert dies nur, solange das Hosting-Pi nicht neu gestartet wird?
user2395126
6

In @ ChrisStrattons Beitrag wird beschrieben, wie Sie stty -F /dev/ttyUSB0das Auflegen vermeiden können, das zu einem Zurücksetzen führt. Hier ist ein Ausschnitt aus Python:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

Beachten Sie, dass die genaue Anzahl beim erneuten Anschließen des USB-Kabels angegeben werden kann. Daher erkenne ich den Pfad durch Globbing:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass
Lekensteyn
quelle
Ich habe bestätigt, dass dies in Ubuntu entweder auf einem generischen x86_64-Laptop oder einem Raspberry Pi 2 funktioniert.
Cerin
Gibt es einen Grund zu verwenden , termiosüber, sagen wir, os.system("stty -F /dev/ttyUSB0 -hupcl")? Übrigens ist mir auch aufgefallen, dass dies das Zurücksetzen des Arduino beim ersten Herstellen einer Verbindung nach dem Einschalten des Hostsystems nicht verhindert. Es verhindert, dass es bei nachfolgenden Verbindungen zurückgesetzt wird. Welches ist besser als nichts. Aber ich wünschte, ich könnte herausfinden, wie ich verhindern kann, dass DTR umgeschaltet wird.
Jason C
2
@JasonC Using termiosspeichert einen Fork / Exec (Aufruf) in einem externen Programm ( stty). Ich bin mir nicht sicher, was ich mit der DTR-Sache tun soll. Ich glaube, ich habe diese "Funktion" einfach akzeptiert und eine Logik hinzugefügt (benutzerdefinierter Handshake durch Schreiben / Lesen), um festzustellen, ob das Arduino und die Anwendung auf dem Pi synchronisiert wurden.
Lekensteyn
Meine ultimative Lösung bestand darin, den Befehl stty beim Booten des Pi hinzuzufügen, gefolgt von einem Echo an den Port, um das erste Zurücksetzen zu erzwingen, und einer Verzögerung von 3 Sekunden, um auf das Zurücksetzen des Arduino zu warten. Dann muss ich danach nicht mehr darüber nachdenken oder mich in Python-Skripten darum kümmern. Ich habe es in rc.local gemacht, aber wo auch immer. Die Kosten betragen +3 Sekunden Pi-Boot-Zeit.
Jason C
3

Sie können einen 120-Ohm-Widerstand (oder eine Kombination aus 120-Ohm) zwischen RESETund hinzufügen. 5VDadurch wird ein vollständiges Zurücksetzen verhindert. Dies ist am wenigsten invasiv, da bei anderen Lösungen entweder ein Widerstand oder ein Kondensator von der Platine entfernt werden muss. Dies erschwert das Hochladen. Behalten Sie den Widerstand nicht bei, wenn Sie programmieren. Entfernen Sie es.

Geben Sie hier die Bildbeschreibung ein

Leonardo-Karten werden nicht zurückgesetzt, selbst wenn sie DTRausgelöst werden. Das Problem beginnt jedoch, wenn Sie sie remote zurücksetzen müssen, da manchmal die Verbindung zu Raspberry unterbrochen wird und Sie sie physisch zurücksetzen müssen.

Piotr Kula
quelle
3
Ich bin mir nicht sicher, ob dies eine Ablehnung verdient. Es ist zum Kotzen und nicht softwarebasiert, aber nach einigen Recherchen scheint es die richtige Hardwarelösung zu sein.
Jason C
0

Wenn Sie die Seria- und die pySerial-Bibliothek verwenden, können Sie Folgendes verwenden:

ser = serial.Serial ('/ dev / ttyACM0', 9600, dsrdtr = True)

polo04
quelle
-1

Sie können PySerial verwenden. Hier ist ein Beispiel für Python-Code:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

Weitere Optionen finden Sie unter Pyserial.

hsantana8
quelle
1
Dies ist kein Problem der Bibliothek. Ich habe bereits 4 verschiedene Bibliotheken ausprobiert, immer das gleiche Ergebnis - DTR-Befehle werden ignoriert.
Jnovacho
Wenn dies eine genaue Aussage über etwas ist, das unter einem anderen Linux funktioniert, sollte es auch auf dem pi funktionieren, da die pi-Hardware nur generische Linux-Software hostet und nicht eindeutig involviert ist.
Chris Stratton
1
Das funktioniert nicht. Unter Linux wird das Arduino dadurch immer noch zurückgesetzt.
Cerin
1
Kann bestätigen, dass dies auf keiner Version von Pi und Arduino funktioniert, die ich habe (ich weiß nicht, sorry, ich weiß nichts von diesen Dingen, ich möchte nicht wissen, ich habe nur ein System zum Debuggen von Code erhalten on, heh.) Auch nicht sicher, ob es verwandt ist, sondern stty -F /dev/ttyUSB0 -cdtrdsrBerichte invalid argument: -cdtrdsr.
Jason C