Sie sind auf Seite 1von 13

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 soft are es muy fcil de utilizar. Actualmente muchos ordenadores porttiles no vienen con puerto serie incorporado !no traen un conector "#$%. &sto no es pro'lema, ya (ue se pueden emplear conversores US !serie. )o utilizo much*simo el puerto serie para controlar los ro"ots y comunicarme con los microcontroladores (ue uso. As* es como naci el proyecto stargate, en el (ue hay definidos unos protocolos muy sencillos para comunicar aplicaciones cliente desde el PC con pe(ue+os servidores (ue corren en los microcontroladores !los star#ates%. ,n ejemplo es el ro'ot Cu'e -evolutions (ue utiliza una tarjeta ./ypic, 'asada en el microcontrolador PIC1$%&'$(. &n este cuaderno tcnico se muestran diferentes ejemplos de uso del puerto serie utilizando el lenguaje Python. 0odos los ejemplos funcionan tanto en )inu* como en +indo,s. Para las comunicaciones serie se ha utilizado la li"rer-a pyserial y muchos de los ejemplos son modificaciones de los ejemplos (ue hay en ella. Los e.emplos (ue se muestran son1

scan/py: ,tilidad (ue escanea los puertos serie mostrando cules estn disponi'les. s#!eco1/py 1 Prue'as de 2eco3. .e env*a una cadena a $455 'audios y se espera reci'ir lo mismo !reci'ir su 2eco3%. Para ello es necesario tener un

microcontrolador con el servidor de eco gra'ado, o 'ien unir los pines 6 y 7 !-8 y 08% del conector serie.

s#!eco0/py 1 9ismo ejemplo (ue sg:eco;<py, pero ahora se pasa como parmetro el dispositivo serie (ue se (uiere emplear, en vez de tenerlo 2ca'leado3
en una varia'le interna.

miniterm/py1 9ini:terminal de comunicaciones. 0odo lo (ue se teclea se env*a por el puerto serie, y todo lo reci'ido se imprime en pantalla. &sta aplicacin
es fundamental para hacer prue'as con el puerto serie.

Instalacin en 1e"ian 23U4)inu*


&stos programas de ejemplo se han pro'ado en una m(uina con 1e"ian45tch. =ay (ue tener instalado python y el mdulo python!serial1 # apt-get install python python-serial Para pro'ar los ejemplos descargar el pa(uete pyserial:ejemplos.zip y descomprimirlo en un directorio de tra'ajo.

Instalacin en +indo,s
&s necesario tener instalados estos tres componentes1

Lenguaje Python. &8tensiones de Python para >indo s. 9dulo Pyserial.


A(u* estn disponi'les los enlaces a los instaladores para ,indo,s1

1. ?nstalador de python 6.@ para >indo s. !python:6.@.msi% 2. ?nstalador de las e8tensiones de Python para >indo s. !py in76:6;5. in76:py6.@.e8e% 3. ?nstalador del mdulo Pyserial. !pyserial:6.6. in76.e8e%.
Para pro'ar los ejemplos descargar el pa(uete pyserial:ejemplos.zip y descomprimirlo en un directorio de tra'ajo.

5.emplo 6hola mundo7 1: 5scaneo de los puertos serie (scan/py)


Pro#rama1 Ascan.pyB 5*plicacin1
&jemplo (ue define una funcin de escaneo (ue devuelve una lista con los nCmeros y nom'res de los puertos serie (ue se han a'ierto con 8ito !y (ue por tanto e8isten en nuestro sistema y los podemos usar%. D'servar (ue la li'rer*a pyserial utiliza los nCmeros del 8 al 099 para referirse a los puerto serie. &sto es as* para (ue sea multiplataforma. 0am'in es posi'le a'rir los puertos serie con los nom'res t*picos de cada sistema operativo !EdevEttyF en Linu8, CD98 en >indo s%. Pero para (ue el programa sea multiplataforma y corra en am'os sistemas, hay (ue utilizar los nCmeros entre el 5 y 6@@. A'rir el puerto serie es tan fcil como invocar a la clase Serial, indicando el nCmero de puerto serie a a'ir1 G:: A'rir puerto serie s H serial..erial!i% .i el puerto no e8iste, se produce una e8cepcin, (ue en el ejemplo de scan.py se captura y no se hace nada, para seguir pro'ando ms puertos. .i no ha ocurrido ningCn error, se mete en la lista dispositivos_serie tanto el nCmero del puerto encontrado como su nom're1 #-- Si no hay errores, anadir el numero y nombre a la lista dispositivos<serie.append! !i, s.portstr%% &l programa principal simplemente invoca a la funcin scan() y muestra los resultados por pantalla. .e pueden emplear dos parmetros opcionales. ,no es el nCmero de puertos seriea a pro'ar. Por defecto se prue'an los 65 primeros. &l otro es el modo 2ver'ose3, tam'in activado por defecto, (ue muestra informacin so're los puertos (ue se van escanenando.

5.emplo de utilizacin1
python scan.py &n linu8 se pueden poner permisos de ejecucin y teclear directamente ./scan.py para ejecutarlo. &jemplo de funcionamiento en 23U4)inu*1

&jemplo de funcionamiento en +indo,s1

3otas so"re el puerto serie en )inu* 1


La li'rer*a pyserial asocia los n:meros de puerto serie 8; 1; 0, etc a los dispositivos /dev/ttyS0; /dev/ttyS1; /dev/ttyS2, etc, respectivamente. .in em'argo, cuando se utiliza un conversor US !serie, los dispositivos (ue aparecen son 4dev4ttyUS 8, 4dev4ttyUS 1, etc...

Para hacer (ue estos nuevos dispositivos se puedan usar con pyserial se pueden hacer dos cosas1 ;. ("rir directamente el puerto serie especi<icando el dispositivo . &jemplo1 s = serial.Serial(/dev/ttyUSB0). &l pro'lema de esto es (ue no es multiplataforma. .i se ejecuta en >indo s se producir un error. 6. =acer un lin> entre el dispositivo 4dev4ttyUS * y un 4dev4ttySz ?ue no se est usando . &n mi caso utilizo los nom'res EdevEtty.;5, EdevEtty.;;... para asignarlos a los EdevEtty,.#5, EdevEtty,.#;... respectivamente. Por ejemplo1 $ sudo ln -s /dev/ttyUSB0 /dev/ttyS10

"e esta forma al ejecutar scan() se detectar (ue est disponi'le el dispositivo con nCmero ;5 !es lo (ue se muestra en el pantallazo de Linu8%

5.emplo 6hola mundo7 0: Prue"a de 6eco7 1 (s#!eco1/py)


Pro#rama1 Asg:eco;.pyB 5*plicacin1
Para realizar prue'as con el puerto serie, lo ms recomenda'le es comenzar utilizando un hard are (ue haga 2eco3 de todo lo (ue se le env*a. .e puede realizar de dos maneras1 ;. Utilizar un ca"le para unir los pines 0 y @ (AB y CB) del conector 1 D del puerto serie . "e esta manera todo lo (ue el PC env*a hacia el e8terior es automticamente reci'ido

2. Conectar un hard,are con un microprocesador ?ue ten#a #ra"ado un <irm,are para implementar la <uncionalidad de eco . Por ejemplo, utilizando
una tarjeta ./ypic, !(ue usa un micro P?C;4IJK4A% con el servidor de eco gra'ado. &l programa sg:eco;.py a're el puerto serie, y si no se produce ningCn error, env*a la cadena de prue'a 2 Hola como estas3 . Para ello se utiliza el mtodo write()1

G:: &nviar la cadena de prue'as print " !"#$%& ' " ( )adena s.*rite+)adena,-

La cadena sale por el puerto serie y el hard are hace 2eco3. &l programa se (ueda esperando hasta reci'ir tantos 'ytes como los (ue tiene la cadena (ue ha sido enviada. Para ellos se invoca al mtodo read() pasando como argumentos el nCmero de 'ytes (ue se (uiere reci'ir. #-- sperar hasta recibir la cadena enviada... #-- & hasta .ue haya un timeout recibido / s.read+len+)adena,,-

Ahora pueden ocurrir dos cosas. #ien (ue la cadena llegue correctamente !se reci'en tantos 'ytes como los (ue se han enviado% o 'ien (ue no lleguen todos, producindose un timeout.

5.emplo de utilizacin1
python s0-eco1.py &n linu8 se pueden poner permisos de ejecucin y teclear directamente ./s !eco".py para ejecutarlo. Los pantallazos para Linu8 y >indo s se muestran con el ejemplo sg:eco6.py, (ue son similares a sg:eco;.py. .i todo ha ido 'ien, lo (ue aparecer en pantalla ser1 1ruebas del puerto serie 1uerto +0,' /dev/ttyS0 !"#$%& ' 2ola como estas 3 )#B#%&' 2ola como estas &45 &n indo s aparecer CD9; donde pone EdevEtty.5

.i se (uiere utilizar otro puerto serie diferente del 5, hay (ue modificar la varia'le #uerto.

5.emplo 6hola mundo7 @: Prue"a de 6eco7 0 (s#!eco0/py)


Pro#rama1 Asg:eco6.pyB 5*plicacin1
&ste ejemplo hace e8actamente lo mismo (ue sg:eco;.py, pero ahora se le pasa como argumento el nCmero de puerto serie a emplear. .e ha divido en dos ejemplos para separar la parte de comunicaciones serie con la de anlisis de los argumentos, para (ue (uede ms claro. Pero funcionalmente son e(uivalentes.

5.emplo de utilizacin1
.e invoca el programa pasando como argumento :p 8, donde 8 es el nCmero o nom're del puerto serie a utilizar. python s0-eco6.py -p 0 &n linu8 se pueden poner permisos de ejecucin y teclear directamente ./s !eco$ !p 0 para ejecutarlo. &jemplo de funcionamiento en 23U4)inu*1

.e est utilizando el puerto EdevEtty.;5 (ue es un conversor ,.#:serie !EdevEtty,.#5%. .e ha hecho un lin/ sim'lico al dispositivo EdevEtty.;5 para (ue pyserial lo

reconozca. &jemplo de funcionamiento en +indo,s1

.e est utilizando el puerto CD9; (ue est asociado al nCmero 5.

5.emplo 6hola mundo7 E: Mini!terminal (miniterm/py)


Pro#rama1 Aminiterm.pyB 5*plicacin1
9initerminal de comunicaciones para hacer prue'as rpidas. 0odo lo (ue se teclea se env*a por el puerto serie y todo lo (ue se reci'e se imprime en la pantalla. .e utiliza un hilo !thread% para leer del puerto serie y mostrar en pantalla. &l hilo principal est pendiente de enviar todo lo (ue el usuario teclea. .e utiliza el mdulo pyconsola<io para leer las teclas.

5.emplo de utilizacin1
.e invoca de la siguiente manera1 python miniterm.py -p 0 &jemplo de funcionamiento en 23U4)inu*1

&jemplo de funcionamiento en +indo,s1

)a li"rer-a 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, indo!s y "ac#S. La ra$%n por la &ue he hecho estos e'emplos utili$ando pyserial en (e$ de USPP es &ue desconoca su existencia hasta hace apenas dos das antes de la publicaci%n de esta documentaci%n. )iene la (enta'a de &ue permite reali$ar comunicaciones usando la norma RS-485, &ue es half*duplex. En este modo se +estiona autom,ticamente la direcci%n de la transferencia usando la lnea -)S. )ambi.n es muy f,cilmente portable a otras plataformas. /0mpresionante traba'o 0saac1 2racias por tu traba'o y por liberarlo para &ue todos lo podamos usar. 3*4

1o,nload
Para descar#ar pyserial:ejemplos.zip 0odos los ejemplos1 scan.py, sg:eco;.py, sg:eco6.py y miniterm.py

1ocumentacin
Li'rer*a pyserial. 9uchos ejemplos y documentacin completa de la AP? 9dulo pyconsola<io1 Lectura de teclas sin esperar a (ue se pulse &nter Pgina oficial del lenguaje Python. Proyecto stargate1 Control de dispositivos e8ternos desde el PC .ervidor de eco1 Iirm are para (ue diferentes microcontroladores hagan 2eco3 de todo lo reci'ido por su puerto serie 0arjeta ./ypic1 una tarjeta entrenadora 'asada en el microcontrolador P?C;4IJK4A Cuaderno tcnico ;1 Comunicaciones serie. Cu'e -evolutions1 ,n ejemplo de un ro'ot (ue se controla por puerto serie desde el PC. ,tiliza una ./ypic.

(utores
Chris )iechti

Luan Monzlez

)icencia
0his or/ is licensed under a Creative Commons Attri'ution:.hareAli/e 6.@ .pain License &ste proyecto tiene una licencia li"re. .e permite su copia, modificacin y distri'ucin, 'ajo los trminos de la licencia Creative commons. 0odo el soft are tiene licencia MPL.

Crditos:
0odos los ejemplos estn 'asados en los creados por Chris )iechti para el proyecto pyserial. &l primer contacto (ue tuve con el manejo del puerto serie 'ajo Python fue gracias a -afael 0revi+o. La Li'rer*a pyserial la descu'r* gracias a 2eden 1omin#uez, (ue durante la campus party 6554 las utilizamos para hacer la ./ylamp, un fle8o (ue se
pod*a encender y apagar a travs de internet.

(#radecimientos
A -icardo Mmez y Andrs Prieto:9oreno por pro'ar todos los ejemplos en >indo s, encontrar errores y generar las capturas de pantallas. 9uchas
gracias N:%

A Isaac arona por enviarme el enlace a la li'rer*a serie ,.PP.

3oticias
114("ril4088': Pu'licada primera versin de este cuaderno AOndice de cuadernos tcnicosB %uan &on'(le' ?&A-D#D0?C.

Das könnte Ihnen auch gefallen