Necesito crear un programa con algunas características:
1. Que lea datos del puerto serial
2. De esos datos debe encontrar el inicio o cabezal, esto lo hace encontrando un numero impar antecedido por un 1.
3. Una vez encontrado el cabezal debe comenzar a trazar una linea y a parte de esto debe guardar dos valores numéricos ubicados en la posición 8 y 13 luego del cabezal.
4. Debe dibujar esta linea en pantalla de forma permanente aunque con ciertos limites
5. Ademas debe imprimir los valores numéricos a un lado de la linea también de forma permanente
6. El programa debe ejecutarse a tiempo real, es decir cambia la linea cambia el numero
Ya de esto solo me falta el numero 5. Estoy trabajando con **hilos** y en **tkinter**, lo estoy haciendo acá por que fue lo mas rápido que encontré, aunque si alguno de ustedes sabe como modificar esto en otro programa mas eficiente se lo agradezco. Tengo un hilo en el puerto serial recibiendo datos permanentemente, tengo otro hilo dibujando la linea en la pantalla, y **necesito otro hilo que me imprima los números en pantalla sin que se reduzca la velocidad de la linea**, pero lo que he hecho hasta ahora siempre me reduce la velocidad de la linea
En este link le dejo el vídeo que tome de lo que me ejecuta el programa:
[URL="https://www.youtube.com/watch?v=XQ5c1iLxVlw&feature=youtu.be"]animacion con tkinter[/URL]
Ademas aquí les dejo el código para que le den una revisada
Código:
import threading from time import sleep import serial from Tkinter import * from math import sin,pi class eden(object): def __init__(self): # Creo una ventana con lo que necesito S=0;W=1308;H=720;size=H/5; taile=H/4;L=((W/4)*3)+25;K=((W/4)*3)+23;sep=27 line1=size;line2=size*2;line3=size*3;line4=size*4 lig1=taile;lig2=taile*2;lig3=taile*3;pul=lig2+sep;sat=lig3+sep self.vague = Tk() self.ecran = Canvas(self.vague, width=W, height=H,bg="black") self.ecran.pack() self.ecran.create_line(S,line3,K,line3,fill="white") self.ecran.create_line(L,S,L,H,fill="white") self.ecran.create_line(L,lig1,W,lig1,fill="white") self.ecran.create_line(L,lig2,W,lig2,fill="white") self.ecran.create_line(L,lig3,W,lig3,fill="white") self.ecran.create_text(1072,pul,text='Pulso',font=('Helvetica',40),fill="tan") self.ecran.create_text(1099,sat,text='%SpO2',font=('Helvetica',40),fill="tan") self.ecran.pack(fill=BOTH, expand=1) self.vague.after(0, self.adan) self.vague.after(0, self.trou) self.vague.mainloop() def adan(self): # Dibujo una linea en la ventana y actualizo la linea global cnt global cspo2 global donned global donned0 global channel global found global impulsion global oxygene cnt=0;x1=0;x2=0;y1=710;y2=0;j=0;l1=0;l2=0;w=0;k=0;p=0 #Inicilizo variables alto=720; cero=700; ancho=1004; lim=520; amp=0.6 # Establezco algunos valores while True: j=0 while found==0: # Espero hasta que los datos esten listos sleep(0.000001) found=0 if channel==1: impulsion=(donned[j+3]<<8)|(donned[j+8]) #Guardo la suma oxygene=donned[j+13] # Guardo este valor for h in range (2,125,5): y2=cero-(donned[h]*amp) #Dibujo la linea if y2<lim: # bajo la linea y2=lim if y2>alto: # subo la linea y2=alto x2=x1+1 self.ecran.create_line(x2,520,x2,720,fill="black") #Dibujo una linea en la ventana self.ecran.create_line(x1,y1,x2,y2,fill="red")#Dibujo en la ventana la linea y1=y2; x1=x2 if x1>ancho: # Si llega al limite, empiece de nuevo x1=0 else: # Aqui repito lo mismo para poder visualizarlo en tiempo real impulsion=(donned0[j+3]<<8)|(donned0[j+8]) oxygene=donned0[j+13] for h in range (2,125,5): y2=cero-(donned0[h]*amp) if y2<lim: y2=lim if y2>alto: y2=alto x2=x1+1 self.ecran.create_line(x2,520,x2,720,fill="black") self.ecran.create_line(x1,y1,x2,y2,fill="red") y1=y2; x1=x2 if x1>ancho: x1=0 self.vague.update() # Actulizo def trou(self): # Imprimo en la ventana los valores que guarde global impulsion global oxygene self.ecran.create_text(1254,510,text=impulsion,font=('Helvetica',50),fill="CadetBlue") self.ecran.create_text(1254,680,text=oxygene,font=('Helvetica',50),fill="honeydew") def eve(): #Leo el puerto serial y encuentro el cabezal de la trama global dato global donned global donned0 global usb global cspo2 global channel global found usb=0;cspo2=0;estado=0;found=0;donne=0;donned=[];donned0=[];channel=0 #Inicilizo variables for i in range (0,150,1): #Creo dos variables de datos cada una donned.append(i) donned0.append(i) usb = serial.Serial( # Abro mi puerto serial "/dev/ttyUSB0", baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, writeTimeout = 0, timeout = 10, rtscts=False, dsrdtr=False, xonxoff=False) usb.flushInput() usb.flushOutput() while True: donne=usb.inWaiting() dato=usb.read(1) # Leo mi puerto serial un dato por vez dato=[int(s.encode('hex'), 16)for s in dato] # Convierto esos datos a enteros dato=dato[0]# Cuando dato encuentre un 1, empiece el programa if estado==2: # Todo aqui abajo es un switch para decidir que hacer con dato if channel==0: donned[cspo2]=dato else: donned0[cspo2]=dato cspo2+=1 if cspo2>=125: # El perto serial envia 125 datos cada segundo cspo2=0 # Reinicie el contador if channel==1: channel=0 else: channel=1 found=1 estado=0 elif estado==1: if (dato&1)==1: # Si encuenta un 1 continue if channel==0: donned[0]=1 donned[1]=dato else: donned0[0]=1 donned0[1]=dato estado=2 cspo2=2 # Empiece el conteo en 2 else: # Si no, empiece de nuevo estado=0 elif estado==0: if dato==1: estado=1 a1=threading.Thread(target=eve) a2=threading.Thread(target=eden) #a3=threading.Thread(target=pan) a1.start(); a2.start(); #a3.start()