Deaktiviere DTR in pyserial vom Code

8

Ich versuche mit pyserial Daten an ein Arduino zu senden. Aber wenn ich den COM-Port öffne, setzt er DTR niedrig und setzt die Karte zurück. Allerdings habe ich meine Arduino-Code-Setup so, dass ich es in den seriellen Empfangsmodus durch Halten von zwei Tasten für 1 Sekunde setzen muss. Ich würde lieber nicht die serielle Eingabe beim Booten des Arduino machen, wenn möglich.

Offenbar können Sie die Datei serialWin32.py ändern, indem Sie die folgende Zeile ändern:

%Vor%

zu:

%Vor%

Aber gibt es eine Möglichkeit, dies direkt in meinem Python-Skript zu deaktivieren? Ich muss das auch für alle Systeme tun. Ich würde lieber nicht Leute zwingen, ihre grundlegende serielle Konfiguration zu ändern, nur um dieses Skript zu verwenden.

Die serielle Schnittstelle wird wie folgt geöffnet:

%Vor%

Update: Am Ende habe ich eine Lösung gefunden, die für meine Einrichtung gut funktioniert. Da ich die seriellen Daten nicht ständig machen musste, fand ich nur dann eine Möglichkeit, das Zurücksetzen der seriellen Verbindung vom Arduino selbst zu deaktivieren, wenn ich das Gerät in den seriellen Empfangsmodus setzte.

Viele Beiträge haben gesagt, dass Sie den DTR-Reset deaktivieren können, indem Sie einen ~ 100 Ohm Widerstand zwischen 5V und Reset setzen. Aber ich wollte nicht, dass dies eine dauerhafte Sache ist. Also habe ich stattdessen einen Widerstand zwischen PD5 und Reset gesetzt. Dann in der Software:

%Vor%

Nun, wenn ich im seriellen Modus sein will, rufe ich setResetDisable (true) auf, das 5V auf diesen 100 Ohm Widerstand und den Reset-Pin wirft, was verhindert, dass DTR es herunterzieht und den Chip zurücksetzt :) Ich rufe dann einfach setResetDisable (false) auf, wenn ich den seriellen Modus verlasse, damit der Chip wie üblich programmiert werden kann.

    
Adam Haile 17.03.2013, 12:48
quelle

4 Antworten

11

Sie sollten in der Lage sein, DTR vor dem Öffnen des Ports wie folgt zu deaktivieren:

%Vor%

Wenn Sie dies jedoch für die aktuelle Version von pyserial (2.6) unter Windows tun, wird die folgende Ausnahme ausgelöst:

%Vor%

Dies scheint ein Fehler zu sein, der in der neuesten Version der Quelle, der SVN-Revision 445 vom 29. Dezember 2011, behoben wurde (siehe Ссылка ) mit Kommentar:

  

erlaube setRTS, setDTR vor dem Öffnen auf Win32 (um den Anfangszustand zu setzen), doc update

Sieht so aus, als hätte es die 2.6-Version gerade verpasst (hochgeladen am 2. November 2011: Ссылка ).

Außerdem wird die aktuelle Implementierung von setDTR() für POSIX (in serialposix.py ) es sieht aus wie dieser Fehler ist nicht behoben und eine Ausnahme wird ausgelöst, wenn der Port nicht geöffnet ist, so dass eine plattformübergreifende Lösung aussieht unwahrscheinlich.

    
Matthew Murdoch 18.03.2013, 14:21
quelle
1

Die Methode, die Sie beschreiben, scheint die gebräuchlichste Korrektur für dieses Problem zu sein, die ich gesehen habe - also vermute ich, dass es keine einfachere softwarebasierte Lösung gibt. Sie können natürlich den Zustand der DTR-Leitung mit ser.setDTR(level) manuell ändern - allerdings habe ich dies im Fall des Arduino Autoreset nicht versucht, und ich vermute, dass sogar das Umschalten der Leitung unmittelbar nach dem Öffnen der seriellen Schnittstelle nicht möglich ist schnell genug, um das Zurücksetzen zu verhindern.

Die anderen Optionen, die ich sehen kann, die Sie zur Verfügung haben, wären, das Autoreset des Arduino in der Hardware zu verhindern ( siehe hier ), oder um den Code leicht zu ändern, so dass Sie den Arduino neu starten können, nachdem Sie die serielle Verbindung hergestellt haben, und wenn Sie Ihren seriellen Empfangsmodus manuell auslösen, senden Sie ein erstes Signal vom Arduino, um anzuzeigen, dass es nun bereit ist zu empfangen Daten. Oder alternativ könnten Sie eine modifizierte Version der pySerial-Bibliothek mit Ihrem Skript hinzufügen.

    
Michael 18.03.2013 13:37
quelle
0

Deaktivieren von DTR funktioniert nicht für mich:
ser.dtr = None
(Linux 4.4.0 x86_64 / Python 2.7.12 / PySerial 3.4)

Aber das funktioniert:

%Vor%

Ich fand es hier .

    
iman 03.08.2017 04:49
quelle
-1

Hier ist eine Softwarelösung, ich benutze sie seit einiger Zeit selbst und es funktioniert wie ein Zauber:

%Vor%

Beachten Sie, dass der Schlaf der knifflige Teil ist, ohne dass es nicht funktioniert

    
aguaviva 28.08.2013 22:02
quelle