Warte auf Arduino Auto-Reset mit PySerial

8

Ich versuche, Zeilen von einem Arduino-Board mit einem sehr einfachen Code (um das Problem zu zeigen) auf Linux zu lesen.

Python-Code:

%Vor%

Arduino-Code:

%Vor%

Da die Karte automatisch zurückgesetzt wird, wenn die serielle Verbindung geöffnet wird, sind die ersten Bytes wahrscheinlich unbrauchbar. Nach ein oder zwei Sekunden funktioniert alles.

Dies ist eine typische Ausgabe:

%Vor%

Ich sehe jedoch, dass der Arduino IDE Serial Monitor dieses Problem nicht hat, und zeigt eine Verzögerung (während des Neustarts) an und druckt dann alle Zeilen, beginnend mit der ersten.

Gibt es eine Möglichkeit, dieses Verhalten in Python mit pySerial zu emulieren? Das heißt, vor dem Neustart alle Ausgaben zu verwerfen und nichts mehr? Vielleicht durch einige Low-Level-Funktionen?

Ich habe versucht, den relevanten Arduino-Quellcode zu betrachten , aber ich kenne Java nicht und es hat nicht geholfen.

Hinweis: Natürlich könnte ich zum Beispiel für drei Sekunden schlafen, alles verwerfen und von dort anfangen, aber wahrscheinlich würde ich auch einige der ersten Zeilen verwerfen.

Bearbeiten : Offensichtlich existiert dieses Problem unter Windows nicht und die akzeptierte Lösung war nicht notwendig.

    
astrojuanlu 12.01.2014, 09:21
quelle

3 Antworten

9

Der Monitor der Arduino-IDE schaltet den zugewiesenen DTR-Pin des Ports um, wenn er angeschlossen ist. Wo dieses Umschalten einen Reset auf dem Arduino verursacht. Beachten Sie, dass das DTR umgeschaltet wird, nachdem der Monitor den seriellen Anschluss geöffnet hat und bereit ist, Daten zu empfangen. In Ihrem Fall sollte das folgende Beispiel dasselbe tun.

%Vor%

Ich würde auch das Kompliment an das DTR für die Arduino mit AVR hinzufügen mit integrierten USB, wie die Leonardo, Esplora und ähnliche. Das setup () sollte folgendes haben, um darauf zu warten, dass der USB vom Host geöffnet wird.

%Vor%

Es wird keine Auswirkungen für die FTDI-basierten UNO's und dergleichen haben.

    
mpflaga 13.01.2014, 01:19
quelle
2

Mir ist klar, dass dies eine alte Frage ist, aber hoffentlich kann das für jemanden da draußen mit dem gleichen Problem nützlich sein.

Ich hatte ein Problem, bei dem ich, wenn ich eine andere Baudrate als 9600 verwendete, die serielle Verbindung in Python immer nur Kauderwelsch erhielt, auch wenn Serial.begin(...) richtig auf dem Arduino gesetzt wurde und dem im Python-Code verwendeten Wert entspricht . Ich habe online gelesen, dass der Bootloader oder Watchdog eine Sekunde braucht, um geladen zu werden (wenn die Karte aus dem Netz geschaltet wird), und er kann Daten mit einer bestimmten Baudrate über die serielle Schnittstelle senden (möglicherweise für die Chipprogrammierung). Ich vermute, dass dies die serielle Kommunikation in Python vermasselt.

Hier ist der Code, der mir zuverlässige Ergebnisse liefert:

%Vor%

Der Code auf der Arduino-Seite zum Testen ist so einfach:

%Vor%     
Weboide 09.06.2015 00:36
quelle
-1

Sie müssen Ihre var einstellen, versuchen Sie:

%Vor%

Beachten Sie jedoch, dass dies eine 32-Bit-Variable ist und wenn sie voll ist, einen Überlauf und einen Neustart verursacht. für mich arbeiten. Wie von @Kobi K vorgeschlagen, addiere eine minimale Verzögerungszeit, zum Laden von echten Daten bei 9600 Boud hat jedes Zeichen eine Dauer von 2 ms,

%Vor%

Und in Python müssen Sie ein Pyserial wie folgt deklarieren:

%Vor%

hoffe das hilft dir

    
archetipo 12.01.2014 14:51
quelle

Tags und Links