Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Monitor puerto serie.

Estas en el tema de Monitor puerto serie. en el foro de Python en Foros del Web. Hola. Tengo hecho un script python-tk, en el cual monitoreo puerto serie de arduino, una webcam y unas alarmas de mails. Funciona a la perfeccion. ...
  #1 (permalink)  
Antiguo 06/12/2015, 09:41
 
Fecha de Ingreso: diciembre-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Monitor puerto serie.

Hola.
Tengo hecho un script python-tk, en el cual monitoreo puerto serie de arduino, una webcam y unas alarmas de mails. Funciona a la perfeccion.
Se me ocurrio pasarla a wxpython y me encuentro en un atasco. busque y no comprendo o algo me pasa.
pongo un trozo de monitoreo de una temperatura.
Solo capturo la primera vez, se queda en ella. No refresca, igual un proceso o algo asi.
Gracias por todo que aprendi por aqui.
Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx
import serial
from time import *

ser = serial.Serial('/dev/ttyACM0', 9600)


class Termometro(wx.Frame):
    def __init__(self, prnt):
        wx.Frame.__init__(self, parent=prnt, title='Termometro')
        self.SetClientSize(wx.Size(380, 160))
        peso = wx.StaticText(self, label="TEMPERATURA: ", pos=(30, 45))
        peso.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.leepeso = wx.TextCtrl(self, value="", pos=(170, 30), size=(160, 50))
        self.leepeso.SetFont(wx.Font(22, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.leepeso.SetForegroundColour("red")
        self.lee()

    def lee(self):
        dato = ser.readline()  # lo leido de arduino lo trata como cadena
        self.leepeso.SetValue(str(dato[0:5]))  # dato a mostrar por el TextCtrl

if __name__ == '__main__':
    app = wx.App()
    frame = Termometro(None)
    frame.Show()
    app.MainLoop()

Última edición por razpeitia; 06/12/2015 a las 14:52
  #2 (permalink)  
Antiguo 06/12/2015, 13:25
 
Fecha de Ingreso: diciembre-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: Monitor puerto serie.

rebuscando por aqui, algo vi que me acerca.
[URL="http://www.forosdelweb.com/f130/ejecutar-funcion-cada-cierto-tiempo-wxpython-937104/"]http://www.forosdelweb.com/f130/ejecutar-funcion-cada-cierto-tiempo-wxpython-937104/[/URL]
Pero se me cuelga con el puerto serie. empieza bien pero acaba mal.

Código:
       
        self.Bind(wx.EVT_TIMER, self.onTimer)

        self.timer = wx.Timer(self, -1)
        self.timer.Start(1000)

    def onTimer(self, event):
        ser.readline()
        self.dato = ser.readline()  # lo leido de arduino lo trata como cadena
        self.leepeso.SetValue(str(self.dato[0:5]))
        return True
  #3 (permalink)  
Antiguo 12/12/2015, 12:39
 
Fecha de Ingreso: diciembre-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: Monitor puerto serie.

Al final lo solucione con procesos.
Con Tkinter la ventana y el puerto serie no necesitaban de procesos:
ventana.after(1, update)
Pero con Wx ni eventos, ni Refrehs, con un proceso solucionado.
Termetro por serial.
Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx
import wx.gizmos as gizmos
import serial
from threading import Thread


ser = serial.Serial('/dev/ttyACM0', 9600)


class TermoTrehad(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, size=(600, 150))
        self.led = gizmos.LEDNumberCtrl(self, -1, (0, 30), (130, 50))
        self.led.SetForegroundColour("red")

        t = Thread(target=self.empieza)
        t.start()

    def empieza(self):
        while True:
            self.dato = ser.readline()
            self.led.SetValue(str(self.dato))


if __name__ == '__main__':
    app = wx.App()
    frame = TermoTrehad(None)
    frame.Show()
    app.MainLoop()

Etiquetas: monitor, puerto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:24.