Sie sind auf Seite 1von 11

Cuaderno tcnico 11: Utilizacin del puerto serie desde Python (Mdulo Pyserial)

Introduccin
La comunicacin a travs del puerto serie se sigue utilizando mucho para conectar el PC con
otros dispositivos, como por ejemplo microcontroladores. Adems de estar soportado en todos
los ordenadores y dispositivos, la interfaz software es muy fcil de utilizar. Actualmente muchos
ordenadores porttiles no vienen con puerto serie incorporado (no traen un conector DB9). Esto no
es problema, ya que se pueden emplear conversores USB-serie.
Yo utilizo muchsimo el puerto serie para controlar los robots y comunicarme con los
microcontroladores que uso. As es como naci el proyecto stargate, en el que hay definidos unos
protocolos muy sencillos para comunicar aplicaciones cliente desde el PC con pequeos
servidores que corren en los microcontroladores (los stargates).
Un ejemplo es el robot Cube Revolutions que utiliza una tarjeta Skypic, basada en el
microcontrolador PIC16F876A.
En este cuaderno tcnico se muestran diferentes ejemplos de uso del puerto serie utilizando
el lenguaje Python. Todos los ejemplos funcionan tanto en Linux como en Windows. Para las
comunicaciones serie se ha utilizado la librera pyserial y muchos de los ejemplos son
modificaciones de los ejemplos que hay en ella.
Los ejemplos que se muestran son:
scan.py: Utilidad que escanea los puertos serie mostrando cules estn disponibles.
sg-eco1.py : Pruebas de eco. Se enva una cadena a 9600 baudios y se espera recibir lo
mismo (recibir su eco). Para ello es necesario tener un microcontrolador con el servidor
de eco grabado, o bien unir los pines 2 y 3 (Rx y Tx) del conector serie.
sg-eco2.py : Mismo ejemplo que sg-eco1_py, pero ahora se pasa como parmetro el
dispositivo serie que se quiere emplear, en vez de tenerlo cableado en una variable
interna.
miniterm.py: Mini-terminal de comunicaciones. Todo lo que se teclea se enva por el
puerto serie, y todo lo recibido se imprime en pantalla. Esta aplicacin es fundamental para
hacer pruebas con el puerto serie.

Instalacin en Debian GNU/Linux
Estos programas de ejemplo se han probado en una mquina con Debian/Etch. Hay que tener
instalado python y el mdulo python-serial:
# apt-get install python python-serial
Para probar los ejemplos descargar el paquete pyserial-ejemplos.zip y descomprimirlo en un
directorio de trabajo.

Instalacin en Windows
Es necesario tener instalados estos tres componentes:
Lenguaje Python.
Extensiones de Python para Windows.
Mdulo Pyserial.
Aqu estn disponibles los enlaces a los instaladores para windows:
1. Instalador de python 2.5 para Windows. (python-2.5.msi)
2. Instalador de las extensiones de Python para Windows. (pywin32-210.win32-py2.5.exe)
3. Instalador del mdulo Pyserial. (pyserial-2.2.win32.exe).
Para probar los ejemplos descargar el paquete pyserial-ejemplos.zip y descomprimirlo en un
directorio de trabajo.

Ejemplo hola mundo 1: Escaneo de los
puertos serie (scan.py)
Programa: [scan.py]
Explicacin:
Ejemplo que define una funcin de escaneo que devuelve una lista con los nmeros y nombres de
los puertos serie que se han abierto con xito (y que por tanto existen en nuestro sistema y los
podemos usar).
Observar que la librera pyserial utiliza los nmeros del 0 al 255 para referirse a los puerto serie.
Esto es as para que sea multiplataforma. Tambin es posible abrir los puertos serie con los
nombres tpicos de cada sistema operativo (/dev/ttyX en Linux, COMx en Windows). Pero para que
el programa sea multiplataforma y corra en ambos sistemas, hay que utilizar los nmeros entre el 0
y 255.
Abrir el puerto serie es tan fcil como invocar a la clase Serial, indicando el nmero de puerto
serie a abir:
#-- Abrir puerto serie
s = serial.Serial(i)
Si el puerto no existe, se produce una excepcin, que en el ejemplo de scan.py se captura y no se
hace nada, para seguir probando ms puertos.
Si no ha ocurrido ningn error, se mete en la lista dispositivos_serie tanto el nmero del puerto
encontrado como su nombre:
#-- Si no hay errores, anadir el numero y nombre a la lista
dispositivos_serie.append( (i, s.portstr))
El programa principal simplemente invoca a la funcin scan() y muestra los resultados por pantalla.
Se pueden emplear dos parmetros opcionales. Uno es el nmero de puertos seriea a probar. Por
defecto se prueban los 20 primeros. El otro es el modo verbose, tambin activado por defecto,
que muestra informacin sobre los puertos que se van escanenando.
Ejemplo de utilizacin:
python scan.py
En linux se pueden poner permisos de ejecucin y teclear directamente ./scan.py para ejecutarlo.
Ejemplo de funcionamiento en GNU/Linux:

Ejemplo de funcionamiento en Windows:

Notas sobre el puerto serie en Linux:
La librera pyserial asocia los nmeros de puerto serie 0, 1, 2, etc a los
dispositivos /dev/ttyS0, /dev/ttyS1, /dev/ttyS2, etc, respectivamente. Sin embargo, cuando se
utiliza un conversor USB-serie, los dispositivos que aparecen son /dev/ttyUSB0, /dev/ttyUSB1,
etc...
Para hacer que estos nuevos dispositivos se puedan usar con pyserial se pueden hacer dos cosas:
1. Abrir directamente el puerto serie especificando el dispositivo. Ejemplo: s =
serial.Serial(/dev/ttyUSB0). El problema de esto es que no es multiplataforma. Si se
ejecuta en Windows se producir un error.
2. Hacer un link entre el dispositivo /dev/ttyUSBx y un /dev/ttySz que no se est
usando. En mi caso utilizo los nombres /dev/ttyS10, /dev/ttyS11... para asignarlos a los
/dev/ttyUSB0, /dev/ttyUSB1... respectivamente. Por ejemplo:
$ sudo ln -s /dev/ttyUSB0 /dev/ttyS10
De esta forma al ejecutar scan() se detectar que est disponible el dispositivo con nmero 10 (es
lo que se muestra en el pantallazo de Linux)


Ejemplo hola mundo 2: Prueba de eco 1
(sg-eco1.py)
Programa: [sg-eco1.py]
Explicacin:
Para realizar pruebas con el puerto serie, lo ms recomendable es comenzar utilizando un
hardware que haga eco de todo lo que se le enva. Se puede realizar de dos maneras:
1. Utilizar un cable para unir los pines 2 y 3 (RX y TX) del conector DB9 del puerto serie.
De esta manera todo lo que el PC enva hacia el exterior es automticamente recibido
2. Conectar un hardware con un microprocesador que tenga grabado un firmware para
implementar la funcionalidad de eco. Por ejemplo, utilizando unatarjeta Skypic, (que usa
un micro PIC16F876A) con el servidor de eco grabado.
El programa sg-eco1.py abre el puerto serie, y si no se produce ningn error, enva la cadena de
prueba Hola como estas . Para ello se utiliza el mtodo write():
#-- Enviar la cadena de pruebas
print "ENVIADO : " + Cadena
s.write(Cadena);
La cadena sale por el puerto serie y el hardware hace eco. El programa se queda esperando
hasta recibir tantos bytes como los que tiene la cadena que ha sido enviada. Para ellos se invoca
al mtodo read() pasando como argumentos el nmero de bytes que se quiere recibir.
#-- Esperar hasta recibir la cadena enviada...
#-- O hasta que haya un timeout
recibido = s.read(len(Cadena));
Ahora pueden ocurrir dos cosas. Bien que la cadena llegue correctamente (se reciben tantos bytes
como los que se han enviado) o bien que no lleguen todos, producindose un timeout.
Ejemplo de utilizacin:
python sg-eco1.py
En linux se pueden poner permisos de ejecucin y teclear directamente ./sg-eco1.py para
ejecutarlo.
Los pantallazos para Linux y Windows se muestran con el ejemplo sg-eco2.py, que son similares
a sg-eco1.py.
Si todo ha ido bien, lo que aparecer en pantalla ser:
Pruebas del puerto serie
Puerto (0): /dev/ttyS0
ENVIADO : Hola como estas
RECIBIDO: Hola como estas
OK!
En windows aparecer COM1 donde pone /dev/ttyS0
Si se quiere utilizar otro puerto serie diferente del 0, hay que modificar la variable Puerto.

Ejemplo hola mundo 3: Prueba de eco 2
(sg-eco2.py)
Programa: [sg-eco2.py]
Explicacin:
Este ejemplo hace exactamente lo mismo que sg-eco1.py, pero ahora se le pasa como argumento
el nmero de puerto serie a emplear. Se ha divido en dos ejemplos para separar la parte de
comunicaciones serie con la de anlisis de los argumentos, para que quede ms claro. Pero
funcionalmente son equivalentes.
Ejemplo de utilizacin:
Se invoca el programa pasando como argumento -p x, donde x es el nmero o nombre del puerto
serie a utilizar.
python sg-eco2.py -p 0
En linux se pueden poner permisos de ejecucin y teclear directamente ./sg-eco2 -p 0 para
ejecutarlo.
Ejemplo de funcionamiento en GNU/Linux:

Se est utilizando el puerto /dev/ttyS10 que es un conversor USB-serie (/dev/ttyUSB0). Se ha
hecho un link simblico al dispositivo /dev/ttyS10 para que pyserial lo reconozca.
Ejemplo de funcionamiento en Windows:

Se est utilizando el puerto COM1 que est asociado al nmero 0.


Ejemplo hola mundo 4: Mini-terminal
(miniterm.py)
Programa: [miniterm.py]
Explicacin:
Miniterminal de comunicaciones para hacer pruebas rpidas. Todo lo que se teclea se enva por el
puerto serie y todo lo que se recibe se imprime en la pantalla. Se utiliza un hilo (thread) para leer
del puerto serie y mostrar en pantalla. El hilo principal est pendiente de enviar todo lo que el
usuario teclea.
Se utiliza el mdulo pyconsola_io para leer las teclas.
Ejemplo de utilizacin:
Se invoca de la siguiente manera:
python miniterm.py -p 0
Ejemplo de funcionamiento en GNU/Linux:

Ejemplo de funcionamiento en Windows:


La librera USPP
Existen otras libreras de acceso al puerto serie en Python. Una de ellas es la librera USPP desarrollada
por Isaac Barona. Soporta las plataformas Linux, Windows y MacOS. La razn por la que he hecho
estos ejemplos utilizando pyserial en vez de USPP es que desconoca su existencia hasta hace apenas dos
das antes de la publicacin de esta documentacin. Tiene la ventaja de que permite realizar
comunicaciones usando la norma RS-485, que es half-duplex. En este modo se gestiona
automticamente la direccin de la transferencia usando la lnea RTS.
Tambin es muy fcilmente portable a otras plataformas. Impresionante trabajo Isaac! Gracias por tu
trabajo y por liberarlo para que todos lo podamos usar. ;-)

Download
Para descargar
pyserial-ejemplos.zip Todos los ejemplos: scan.py, sg-eco1.py, sg-eco2.py y miniterm.py


Documentacin
Librera pyserial. Muchos ejemplos y documentacin completa de la API
Mdulo pyconsola_io: Lectura de teclas sin esperar a que se pulse Enter
Pgina oficial del lenguaje Python.
Proyecto stargate: Control de dispositivos externos desde el PC
Servidor de eco: Firmware para que diferentes microcontroladores hagan eco de todo lo
recibido por su puerto serie
Tarjeta Skypic: una tarjeta entrenadora basada en el microcontrolador PIC16F876A
Cuaderno tcnico 1: Comunicaciones serie.
Cube Revolutions: Un ejemplo de un robot que se controla por puerto serie desde el PC.
Utiliza una Skypic.

Autores
Chris Liechti
Juan Gonzlez

Licencia

This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 Spain
License
Este proyecto tiene una licencia libre. Se permite su copia, modificacin y distribucin, bajo los
trminos de la licencia Creative commons.
Todo el software tiene licencia GPL.


Crditos:
Todos los ejemplos estn basados en los creados por Chris Liechti para el
proyecto pyserial.
El primer contacto que tuve con el manejo del puerto serie bajo Python fue gracias a Rafael
Trevio.
La Librera pyserial la descubr gracias a Geden Dominguez, que durante la campus
party 2006 las utilizamos para hacer la Skylamp, un flexo que se poda encender y apagar
a travs de internet.

Agradecimientos
A Ricardo Gmez y Andrs Prieto-Moreno por probar todos los ejemplos en Windows,
encontrar errores y generar las capturas de pantallas. Muchas gracias ;-)
A Isaac Barona por enviarme el enlace a la librera serie USPP.

Noticias
11/Abril/2007: Publicada primera versin de este cuaderno

[ndice de cuadernos tcnicos]
Juan Gonzlez
IEAROBOTICS

Das könnte Ihnen auch gefallen