2010-05-02 3 views
5

Im Moment verwende ich einen Arduino, um Daten von einem analogen Sensor an COM4 zu senden. Ich versuche ein Python-Skript zu erstellen, das kontinuierlich diese Daten überwacht und nach einem bestimmten Parameter sucht.Müssen kontinuierlich serielle Daten in Python überwachen

Ich habe versucht, so etwas wie dieses, aber es ist alarmiert mich nicht richtig

import serial 
from Tkinter import * 
import tkMessageBox 

port = "COM4" 
ser = serial.Serial(port,9600) 
value = 0 

while 1: 
    value = ser.read() 
    if value > 400: 
     tkMessageBox.showwarning(
      "Open file",) 
    time.sleep(1) 
+0

Können wir ein Beispiel, was es tut vs. was Sie erwarten? – James

+1

Nun, ich betreibe es in der Wing Python Shell und es bleibt einfach bei "Evauluating blablah.py" - es gibt nie wirklich irgendwelche Werte aus. Dann, wenn ich den USB vom Arduino entferne, kommen die Werte hoch. Als ob sie sich erst registrieren würden, wenn ich das getan hätte. – jakke34

+0

Angenommen, dass ser.read() tatsächlich zurückgibt, wird Tkinter nichts anzeigen, außer Tkinter.Frame (... Tk() ...). Mainloop() wird aufgerufen. – msw

Antwort

3

Wenn das serial Paket, das Sie verwenden pySerial ist, beachten Sie bitte die Definition des Serial.read() method:

read(size=1)

Parameter: Größe - Anzahl der zu lesenden Bytes.

Rückgabe: Bytes vom Port gelesen.

Lesen Sie die Größe Bytes von der seriellen Schnittstelle. Wenn ein Zeitlimit festgelegt ist, kann es weniger Zeichen wie angefordert zurückgeben. Ohne Timeout wird blockiert, bis die angeforderte Anzahl von Bytes gelesen wurde.

in Version geändert 2.5: Gibt eine Instanz von Bytes, wenn verfügbar (Python 2.6 und neuer) und str anders.

Obwohl Sie byte Objekte zu verarbeiten versuchen, können Sie (abhängig von Python-Version) werden Handhabung str oder bytes (Array) Objekte. Diese Objekte entsprechen nicht unbedingt ganzzahligen Werten.

Selbst wenn byte Objekte aus read() empfangen, die größte wird unsigned integer 255 sein Vergleich value mit 400 macht keinen Sinn. Versuchen Sie, den Typ der zurückgegebenen Objekte mit einer einfachen Debugausgabe zu finden.

print type(value) 

Falls Sie ein str Objekt behandeln müssen, überprüfen Sie die Verwendung von ord() für convertion.

(Der flush Vorschlag bezieht sich auf die ursprüngliche Frage, die print verwendet, nicht tkinter).

Siehe how-to-flush-output-of-python-print, und versuchen Sie die Befehlszeilenshell, nicht die IDE, die sich auf die Pufferung auswirken kann.

+0

Es ist nicht einmal meine Bedingung, wenn ich es nicht ausdrucken :( – jakke34

0

Anstatt, dass der Arduino-Code alle analogen Werte an COM4 weiterleitet, muss er nur dann eine Markierung weitergeben, wenn Sie die Bedingung erfüllen.

void loop() { 
    sensorValue = analogRead(sensorPin); 
    if (sensorValue >= 400){ 
    Serial.print("1"); // 1 will be the flag that will be sent to COM4 
    } 

Dann für die Flagge wie dies Ihr Python-Code kann einfach aussehen:

So Arduino Code sein könnte

import serial 
from Tkinter import * 
import tkMessageBox 

port = "COM4" 
ser = serial.Serial(port,9600) 
value = 0 


while 1: 
    value = ser.read(); 
    print value 
    if value == "1": 
     tkMessageBox.showwarning("BLAH", "BLAH\n") 
     exit() 
    else: 
     continue 
0

Unter der Annahme, dass Sie pySerial, verwenden serial.read() liest nur ein Byte, Das bedeutet einen maximalen Wert von 255. Wenn Ihr Arduino Zeichenfolgenwerte zurücksendet, ist es wahrscheinlich am besten, sie mit Zeilenvorschubzeichen zu trennen und serial.readline() zu verwenden.

Sofern Sie keine speziellen Leistungsanforderungen haben, wird das Debuggen durch das Zurücksenden von Strings vom Arduino erheblich vereinfacht.

Auch wenn Sie Strings zurück aus dem Arduino erhalten, sollten Sie Ihre Test if int(value) > 400: sein