2010-05-02 18 views
5

Ahora estoy usando un Arduino para enviar datos de un sensor analógico a COM4. Estoy tratando de hacer un script de Python que monitoree continuamente esos datos y busque un cierto parámetro.Necesidad de monitorear constantemente los datos de serie en Python

he intentado algo como esto, pero no me está alertando correctamente

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

Podemos tener un ejemplo de lo que está haciendo frente a lo que se puede esperar? – James

+1

Bueno, lo estoy ejecutando en el Wing Python Shell y solo se mantiene en "Evaluating blablah.py" - en realidad nunca muestra ningún valor. Luego, cuando desenchufo el USB del arduino, aparecen los valores. Como si no se registraran hasta que lo hice. – jakke34

+0

Suponiendo que ser.read() realmente devuelve Tkinter no va a mostrar nada a menos que se invoque Tkinter.Frame (... Tk() ...). Mainloop(). – msw

Respuesta

3

Si el paquete serial que está utilizando es pySerial, toma nota de la definición de la Serial.read() method:

read(size=1)

Parámetro: tamaño - Número de bytes para leer.

Devoluciones: Bytes leídos desde el puerto.

Leer bytes de tamaño desde el puerto serie. Si se establece un tiempo de espera, puede devolver menos caracteres según lo solicitado. Sin tiempo de espera, bloqueará hasta que se lea el número solicitado de bytes.

cambiado en la versión 2.5: devuelve una instancia de bytes cuando esté disponible (Python 2.6 y posteriores) y str lo contrario.

A pesar de que está intentando procesar byte objetos, es posible (dependiendo de la versión de Python) se manejo str o bytes objetos (array). Estos objetos no se corresponden necesariamente con valores enteros.

Incluso cuando se recibe byte objetos de read(), el mayor entero sin signo será 255. Comparando con value 400 no tiene sentido. Intente encontrar el tipo de los objetos devueltos con un resultado de depuración simple.

print type(value) 

Si usted necesita para manejar un objeto str, comprobar el uso de ord() para la conversión.

(La sugerencia flush se refiere a la pregunta original, que usó print, no).

Consulte how-to-flush-output-of-python-print y pruebe el shell de la línea de comandos, no el IDE, que puede afectar al almacenamiento en búfer de salida.

+0

Ni siquiera está capturando mi condicional cuando no lo imprimo :( – jakke34

0

En lugar de hacer que el código Arduino retransmita todos los valores analógicos a COM4, ​​haga que retransmita una bandera solo cuando se encuentre con el condicional.

código para Arduino podría ser:

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

A continuación, el código Python simplemente puede buscar la bandera de la siguiente manera:

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

Suponiendo que está utilizando pySerial, serial.read() sólo lee un byte, lo que significa un valor máximo de 255. Si su Arduino está enviando valores de cadena hacia atrás, probablemente sea mejor separarlos con caracteres de nueva línea y usar serial.readline().

A menos que tenga requisitos de rendimiento específicos, el envío de cadenas desde Arduino hará que la depuración sea significativamente más fácil de todos modos.

Además, si usted está recibiendo cadenas de vuelta de la Arduino, la prueba debe ser if int(value) > 400:

Cuestiones relacionadas