Escolar Documentos
Profissional Documentos
Cultura Documentos
Listado 1: Hexfunctions.py
def translate2hex(c):
“”” translate character string c to hex representation string
e.g ABC -> 41 42 43 “””
h=””
for ch in c: # iterate over all characters
b=hex(ord(ch)) # get hex value
b=b.replace(“0x”,””) # take away leading “0x for better overview”
b=b.upper() # all in upper characters
if len(b)<=1:
b=”0”+b # e.g. make “0A” out of “A”
h=h+b+” “ # separate bytes by space
return h
# test:
if __name__ == “__main__”:
s=”HELLO\n”
print s, translate2hex(s)
Listado 2: GUI_template.py
import wx
# GUI
class MyFrame(wx.Frame):
# text box with fixed width font for nice data representation
self.textbox=wx.TextCtrl(self, style = wx.TE_MULTILINE,
pos = (5,5),size=(300, 200))
myfont = wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, False, u’Courier’)
self.textbox.SetFont(myfont)
# Bindings
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy)
def disconnect(self):
# set stop event so endless receiving loop can be interrupted
self.stopevent.set()
def connect(self):
# create a new thread object that runs serial thread
self.Bind(wx.EVT_BUTTON, self.OnButton)
# Main program
if __name__ == “__main__”:
app = wx.App(redirect = False)
frame = MyFrame(title=”GUI”, size = (320,270))
frame.Show(True)
frame.Centre()
app.MainLoop()
def readSerial(self):
# endless receiving loop
while not self.stopevent.isSet():
data=““
# synchronize
if ord(c) == 0xAA:
self.ctr += 1
rest = self.sCOM.read(15)
data=c+rest
ls /dev/tt*U*
/dev/ttyUSB0
Diagramas # synchronize
Ahora sólo nos falta mostrar los datos, aparte de if ord(c) == 0xAA:
como texto, también con un diagrama, y visua- self.ctr += 1
lizar los valores generados por el conversor A/D rest = self.sCOM.read(15)
del nodo. data=c+rest
La librería estándar para la representación gráfica
es Matplotlib. Ante todo habrá que instalarla. En la ## update x,y
parte 1 de esta serie de artículos trabajamos con lbyte = ord(rest[6])
el sencillo interfaz de pyplot, con el cual pueden hbyte = ord(rest[5]) & 7
generarse rápidamente diagramas simples. Pero adc = lbyte + hbyte *256
si queremos insertarlos en un entorno gráfico, t=time.time()-self.starttime
la cosa se complica: habrá que utilizar el inter- self.x.append(t)
faz orientado a objetos, que básicamente ofrece self.y.append( adc)
más posibilidades. La documentación relacionada print t,adc
está disponible en la página de Matplotlib [5]. Si
somos principiantes, es posible que el enorme # format c to 16 bytes output
abanico de posibilidades nos supere. En [6] pode- ....
mos encontrar un ejemplo de inserción en wx. wx.WakeUpIdle() #
Antes de modificar el módulo Serialthread es wake up to update text
mejor guardarlo con otro nombre, por ejemplo
Serialthread_diagram.py. Los valores del con- Una vez convertidos, el módulo suministra ade-
versor A/D a representar se encuentran en los más los valores hexadecimales para el diagrama.
bytes 5 y 6 del bloque de datos recibido. Han de
extraerse y transferirse al programa principal. Ahora veamos los cambios en el programa prin-
Las posibilidades son muchas. Una de ellas con- cipal. Ya que hemos cambiado el nombre del
siste en pasarle los arrays x e y como atributos módulo Serialthread, también habrá que llevar
en el objeto Serialthread. Estas coordenadas se a cabo el cambio aquí:
corresponden con los valores x e y del diagrama.
En __init__ añadimos: from serialthread_diagram import *
def __init__(self, **kwargs): Hay otro cambio más en la función OnIdle. Ésta
# create frame es llamada el programa no tiene nada más que
wx.Frame.__init__(self, None, hacer, especialmente cuando hay datos nuevos
**kwargs) aún pendientes.
# text box with fixed width font for def OnIdle( self, event):
nice data representation # if nothing else to do, update text
self.textbox=wx.TextCtrl(self, style from message queue
= wx.TE_MULTILINE, while not self.serial_thread.msg-
pos = (5,5),size=(420, 200)) Queue.empty():
myfont = wx.Font(10, wx.MODERN, wx. msg=self.serial_thread.msg-
NORMAL, wx.BOLD, False, u’Courier’) Queue.get()
self.textbox.SetFont(myfont) self.textbox.AppendText(msg)
Enlaces y bibliografía
[1] Página del ElektorBus:
www.elektor.com/elektorbus
[2a] ElektorBus, Parte 6:
www.elektor.es/110258
[2b] ElektorBus, Parte 8:
www.elektor.es/110428
Sobre el autor
Jean-Claude Feltes imparte clases de
electrónica en el Lycée Technique des Arts
et Métiers en Luxemburg. Esta escuela de
tecnología y artes otorga cualificaciones
profesionales a aprendices y técnicos.
Dedica gran parte de su tiempo libre a su
pasión por la electrónica y la programación
(véase [7]).