Frage:
Zurücksetzen der seriellen Arduino-Schnittstelle in Serial Monitor & Python
user3284376
2014-03-06 17:16:52 UTC
view on stackexchange narkive permalink

Ich verwende also ein Arduino mit einer Abschirmung, um einige Spannungswerte für ein EKG zu erhalten. Ich zeichne diese Daten dann in Python. Wenn ich jedoch die serielle Schnittstelle "beobachte", sei es über den seriellen Arduino-Monitor oder beim Versuch, die Zeitwerte (unter Verwendung von Millis ()) gegen das EKG (Spannung) zu zeichnen, werden die Werte zurückgesetzt, sodass Millis () die Null zurücksetzt ist in Ordnung, außer dass einige der älteren Werte noch angezeigt werden. Dies ist insbesondere in Python ein Problem, da dies bedeutet, dass der Plot zu Beginn des Skripts fehlerhaft funktioniert, weil einige der älteren Werte geplottet werden und nach einigen Sekunden zurückgesetzt wird und der Plot wieder normal aussieht. P. >

Um dies zu demonstrieren, habe ich es auf Video aufgenommen und auf YouTube eingestellt. Hier ist es:

https://www.youtube.com/watch?v=dNpUakcRPec

Nun dachte ich zunächst, das Problem liege bei Python oder dem Pyserial-Modul, also habe ich das Video als solches gekennzeichnet, aber da es auf dem seriellen Monitor auftritt, wurde mir klar, dass die Lösung in der Arduino-Skizze liegen würde. Ich habe versucht zu leeren, habe nicht funktioniert, ich habe sogar versucht, die Daten erst zu starten, wenn ich ein Startbyte gesendet habe, aber dies hat unter Python nicht funktioniert.

Idealerweise konnte ich das Python-Plotskript starten und es würde diese Anfangswerte von der seriellen Schnittstelle überspringen oder ignorieren, bevor es erneut beginnt.

Hier ist die Arduino-Skizze, die ich verwende:

  #include <eHealth.h>unsigned long time; // Die Setup-Routine wird einmal ausgeführt, wenn Sie auf Reset drücken: void setup () {Serial.begin (9600); } // Die Schleifenroutine wird immer wieder ausgeführt: void loop () {float ECG = eHealth.getECG (); Zeit = Millis (); Serial.print (Zeit); Serial.print (""); Serial.print (EKG, 3); Serial.println (""); Verzögerung (50); // 50 Millisekunden warten}  
Ich [habe aufgezeichnet] (https://arduino.stackexchange.com/questions/439/why-does-starting-the-serial-monitor-restart-the-sketch/543#comment104687_543) den [tatsächlichen RESET-Impuls bei serieller Verbindung ] (https://i.stack.imgur.com/KV4Oa.png) (es ist ungefähr 1 ms, abhängig von den Triggerpegeln).
Zwei antworten:
akellyirl
2014-03-06 18:20:36 UTC
view on stackexchange narkive permalink

Sehen Sie sich if (Serial)

an. Dadurch wartet die Skizze auf die serielle Schnittstelle, bevor Sie fortfahren.

  void setup ( ) {// Serial initialisieren und warten, bis der Port geöffnet ist: Serial.begin (9600); while (! Serial) {; // Warten Sie, bis die serielle Schnittstelle eine Verbindung hergestellt hat. }}  

Ich habe einen schleichenden Verdacht, der möglicherweise nur auf dem Leonardo funktioniert.

Wenn ja, könnten Sie eine Alternative ausprobieren:

  1. Lassen Sie Python nach der Verbindung etwas an Arduino senden.

  2. Warten Sie, bis dies in setup () empfangen wird: if (Serial.available ()> 0) {. ..}

  3. Führen Sie die Schleife () normal aus

  4. ol>

    zB

      / / Daten nur senden, wenn Sie Daten empfangen: if (Serial.available () > 0) {// eingehendes Byte lesen: incomingByte = Serial.read (); // sag was du hast: Serial.print ("Ich habe erhalten:"); Serial.println (incomingByte, DEC); }  
TheDoctor
2014-03-06 20:05:11 UTC
view on stackexchange narkive permalink

Der Arduino wird zurückgesetzt, wenn ein serieller Monitor oder ein Skript eine Verbindung zu ihm herstellt. Der beste Weg, dies zu mildern, besteht darin, dem Arduino eine Art "Startsignal" zu senden, wenn Sie eine Verbindung zur seriellen Schnittstelle herstellen. Es würde dann die Daten senden, wenn Ihr Skript fertig war.

Ich verstehe, dass dies jedoch Auswirkungen auf mein Skript hat, da das Skript zu Beginn Müll malt. Meine Frage ist, ob ich dies verhindern kann. Von meinem Standpunkt aus muss ich zuerst die Arduino-Skizze ändern.
Ich habe millis () entfernt und stattdessen einen Zähler in meiner Schleife verwendet. Wenn ich jedoch versuche, mit ser.write ('S') unter Python ein Startsignal an meine serielle Schnittstelle zu senden, empfängt das Arduino es nicht
Sie könnten versuchen, etwas in Ihre "Setup" -Funktion einzufügen, wie "while (Serial.read ()! =" S ");"
Am Arduino-Ende ist es in Ordnung, wenn ich den seriellen Monitor öffne, druckt er glücklich, das Problem liegt in Python, wenn ich versuche, das 'S'-Byte zu senden, scheint die serielle Schnittstelle es nicht zu empfangen.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...