Deaktivieren von DTR in pyserial von code
Ich versuche, pyserial zum senden von Daten an ein arduino. Aber wenn ich öffnen Sie die COM-port-es wird DTR low und setzt das Brett. Allerdings habe ich mein arduino-code-setup, so dass ich steckte es in die Seriell empfangen-Modus durch halten der beiden Tasten für 1 Sekunde. Ich würde lieber nicht haben, um die serial-Eingabe beim Hochfahren des arduino, wenn möglich.
Anscheinend kann man ändern serialWin32.py Datei, ändern Sie die Zeile, die liest:
self._dtrState = win32.DTR_CONTROL_ENABLE
zu:
self._dtrState = win32.DTR_CONTROL_DISABLE
Aber, gibt es eine Möglichkeit, einfach deaktivieren Sie diese direkt in meinem python-Skript? Ich muss auch dazu für alle Systeme. Ich würde eher nicht die Menschen zwingen, zu ändern, Ihre Basis, serial config, nur um dieses Skript verwenden.
Der serielle port geöffnet ist wie folgt:
com = serial.Serial(port, baud, timeout=1);
Update: am Ende habe ich eine Lösung gefunden, die funktioniert gut für mein setup. Da brauchte ich nicht zu tun Serielle Daten die ganze Zeit, nur wenn ich das Gerät in den seriellen empfangen-Modus fand ich eine Möglichkeit zum deaktivieren der reset über die serielle Verbindung vom arduino selbst.
Viele posts haben gesagt, Sie können deaktivieren DTR zurücksetzen, indem Sie ein ~100 Ohm Widerstand zwischen 5V und reset. Aber ich wollte nicht, dass dies eine dauerhafte Sache. Stattdessen legte ich einen Widerstand zwischen PD5 und reset. Dann, in der software:
void setup() {
//.......
DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
PORTD |= (_BV(PD5)); //Set high
//.......
}
inline void setResetDisable(bool state)
{
if(state)
DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
else
DDRD &= ~(_BV(PD5)); //set back to input mode
}
So, jetzt, wenn ich wollen in den seriellen Modus, ich nenne setResetDisable(true), die Würfe 5V über 100 ohm-Widerstand und den reset-pin, der Verhinderung von DTR ziehen Sie niedrig und zurücksetzen den chip 🙂
Ich habe dann rufen Sie einfach setResetDisable(false), wenn ich verlassen serieller Modus damit der chip kann so programmiert werden, als normal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du sollte in der Lage sein zu deaktivieren DTR vor dem öffnen der Schnittstelle, wie diese:
Allerdings so auf der aktuellen Version von pyserial (2.6) auf Windows wirft die folgende Ausnahme:
Scheint dies ein bug, der behoben wird, die in der neuesten version der source -, SVN-revision 445 am 29. Dezember 2011 (siehe http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/serial/serialwin32.py?view=log) mit Kommentar:
Sieht aus wie es möglicherweise verpasste nur knapp die 2.6-Version (hochgeladen am 2. November 2011 siehe: https://pypi.python.org/pypi/pyserial).
Darüber hinaus mit Blick auf die aktuelle Umsetzung von
setDTR()
für POSIX (in serialposix.py) es sieht aus wie dieser bug nicht behoben und eine exception wird geworfen, wenn der port nicht geöffnet ist, so dass ein cross-Plattform-Lösung sieht unwahrscheinlich.stty -hup
auf der Anschluss nicht das problem. Warum ist das so? Wie ist das verbunden mit DTR?Deaktivieren von DTR nicht für mich arbeiten:
ser.dtr = None
(Linux 4.4.0 x86_64 /Python 2.7.12 /PySerial 3.4)
Aber das funktioniert:
Fand ich es hier.
Die Methode, die Sie beschreiben, scheint die häufigste Lösung für dieses problem, die ich gesehen habe - also ich vermute, dass es keine einfachere software-basierte Lösung. Natürlich können Sie manuell ändern Sie den Status der DTR-Leitung mit
ser.setDTR(level)
- aber ich habe nicht versucht, diese speziell im Falle des Arduino-autoreset, und ich vermute, dass auch ein-und ausschalten der Zeile unmittelbar nach dem öffnen der seriellen Schnittstelle ist nicht schnell genug um zu verhindern, dass der reset.Den anderen Optionen kann ich sehen, dass Sie verfügbar wäre, um zu verhindern, dass der autoreset des Arduino-hardware (siehe hier), oder ändern Sie Ihren code so leicht, dass Sie damit die Arduino neu zu starten, nachdem zunächst die Herstellung der seriellen Verbindung, und dann, wenn Sie manuell auslösen Seriell empfangen-Modus senden einer ersten signal aus dem Arduino zu zeigen, dass es jetzt bereit, Daten zu empfangen. Oder, alternativ, Sie könnten eine modifizierte version des pySerial-Bibliothek mit Ihrem Skript.
Hier ist eine software-Lösung, ich habe mit es mir für eine Weile, und es funktioniert wie ein Charme:
Beachten Sie, dass der Schlaf ist der schwierige Teil, ohne den es nicht funktionieren