domingo, 12 de diciembre de 2010

Python: enviando texto a otra ventana

Continuando con la tarea de la anterior entrada, el texto recogido por la respuesta del dispositivo conectado al puerto serie necesita ser enviado a un campo de formulario de otra aplicación. Esto ya en Windows.

En este caso he echado mano de la librería SendKeys para Python 2.6. Aquí está toda la documentación para entender cómo funciona.

La escena viene a ser: tengo un programa abierto a cuyo código fuente no tengo acceso, y necesito leer la respuesta de un dispositivo conectado por el puerto serie al equipo. Con el script de la entrada anterior tengo el texto de la respuesta, y el siguiente paso es enviar ese texto al programa citado antes.

La solución: SendKeys. Envíar o simular señales de teclas usando API's de Windows. Pensé que si ejecutaba script con una combinación de teclas, teniendo el foco en el campo del formulario donde quiero recibir el texto, luego valdría con enviar las señales de ALT+TAB seguidas de aquellas que compongan la respuesta recibida del dispositivo externo.

No sé si será el método más ortodoxo, pero funciona a la perfección :)

import SendKeys
texto = "prueba"
SendKeys.SendKeys("""%{TAB}""" + texto)

Python y el puerto serie

Estos últimos días he necesitado comunicarme con un dispositivo a través de un puerto serie. Como python y yo teníamos una conversación pendiente he aprovechado esta tarea para hacer mis primeros pinitos con este lenguaje tan interesante.

Para el que, como yo, no conozca nada de Python, la página de wikipedia en español tiene muchísima información que permite al menos soltarte las manos y tontear un poco antes de ponerte con algo "serio". Información con más profundidad se puede encontrar en su manual de referencia.

Para conseguir mi objetivo he usado la librería pySerial. En este enlace se encuentra toda su documentación. Muy detallada y con ejemplos útiles.

En primer lugar y por probar he hecho un script que escanea la disponibilidad de los puertos del sistema. No tiene mucha historia, por lo que se entiende fácilmente.

import serial

disponibles = []

for i in range(10):
    try:
        s = serial.Serial(i)
        disponibles.append((i, s.portstr))
        s.close()
    except:
        pass
       
print "Puertos disponibles: "
for numpuerto,nombre in disponibles:
    print "%d -> %s" % (numpuerto, nombre)


Veamos el resultado:


En mi sistema se han encontrado cuatro puertos serie disponibles. Con el siguiente script se consigue enviar una cadena de texto por un puerto elegido y recibir una respuesta... si es que la hay.

import serial
import sys

#-- Se abre el puerto elegido y se establece el tiempo de espera máximo
try:
    s = serial.Serial(1)
    s.timeout=2;
except serial.SerialException:
    print "Error al abrir el puerto."
    sys.exit()
   
# Se envía el texto
texto = "Texto a enviar"
s.write(texto)

# Se recibe la respuesta del dispositivo 

# 10 son los bytes máximos que se esperan 
respuesta=s.read(10);

if len(respuesta)>0 :
    print "Respuesta: " + respuesta
else:
    print "Tiempo de espera agotado."




Sí. Habría sido más interesante tener algún dispositivo que respondiera y así poder tratar su respuesta o configurar parámetros del puerto con más detalle, o que al menos hiciera eco. La próxima vez será :)

miércoles, 8 de diciembre de 2010

Servicios con sysv-rc-conf

Este comando sirve para administrar el nivel de ejecución de los servicios en el inicio del sistema o bien pararlos o ejecutarlos cuando sea necesario. Puede usarse su interfaz en consola o usar sus opciones por comandos, pero generalmente es más útil lo primero.


La interfaz es muy sencilla, presentando todos los procesos disponibles en la columna izquierda y los diferentes niveles de ejecución seguidos.

Se encuentra disponible en los repositorios oficiales de ubuntu.

# apt-get install sysv-rc-conf
# sysv-rc-conf