2010-05-02 11 views
5

In questo momento sto utilizzando un Arduino per inviare dati da un sensore analogico a COM4. Sto provando a creare uno script Python che monitora continuamente quei dati e cerca un determinato parametro.Necessità di monitorare costantemente i dati seriali in Python

Ho provato qualcosa di simile, ma non mi viene segnalata correttamente

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

Possiamo avere un esempio di quello che sta facendo rispetto a quello che ci si aspetta? – James

+1

Beh, lo sto eseguendo nella Shell Python Wing e rimane solo su "Evauluating blablah.py" - non emette mai alcun valore. Quindi quando disconnetto l'USB dall'arduino i valori vengono visualizzati. Come se non si fossero registrati fino a quando non l'avessi fatto. – jakke34

+0

Supponendo che ser.read() restituisca effettivamente Tkinter non mostrerà nulla a meno che Tkinter.Frame (... Tk() ...). Venga chiamato mainloop(). – msw

risposta

3

Se il pacchetto serial si sta utilizzando è pySerial, prendere atto della definizione del Serial.read() method:

read(size=1)

Parametro: dimensione - Numero di byte da leggere.

Restituisce: i byte letti dalla porta.

Leggere i byte di dimensione dalla porta seriale. Se è impostato un timeout, può restituire meno caratteri come richiesto. Senza timeout si bloccherà fino a leggere il numero richiesto di byte.

Modificato nella versione 2.5: restituisce un'istanza di byte quando disponibile (Python 2.6 e successivi) e str altrimenti.

Anche se si sta cercando di elaborare byte oggetti, è possibile (a seconda della versione di Python) gestirà str o bytes (Array) oggetti. Questi oggetti non corrispondono necessariamente a valori interi.

Anche quando riceve byte oggetti da read(), il più grande intero senza segno sarà 255. Confrontando value con 400 non ha senso. Prova a trovare il tipo di oggetti restituiti con un semplice output di debug.

print type(value) 

Se è necessario gestire un oggetto str, controllare l'uso di ord() per conversione.

(Il suggerimento flush fa riferimento alla domanda originale, che utilizzava print, non tkinter).

Vedere how-to-flush-output-of-python-print e provare la shell della riga di comando, non l'IDE che può influire sul buffer di output.

+0

Non sto nemmeno prendendo il mio condizionale quando non lo stampo :( – jakke34

0

Invece di fare in modo che il codice Arduino trasmetta tutti i valori analogici a COM4, ​​fare in modo che trasmetta un flag solo quando si incontra il condizionale.

codice in modo arduino potrebbe essere:

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

Allora il tuo codice Python può solo guardare la bandiera in questo modo:

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

Supponendo che si sta utilizzando pySerial, serial.read() legge un solo byte, che significa un valore massimo di 255. Se il tuo Arduino sta inviando valori stringa è probabilmente meglio separarli con caratteri newline e usare serial.readline().

A meno che non si abbiano requisiti prestazionali specifici, l'invio di stringhe da Arduino renderà il debug molto più semplice.

Anche se si ricevono le stringhe di ritorno da Arduino, il test dovrebbe essere if int(value) > 400:

Problemi correlati