PROGRAMACION DEL PUERTO SERIE CON PYTHON

Para poder programar el puerto serie por python evidentemente tenemos que tener instalado python, que segun la distribucion de Linux que tengamos, Debian, Ubuntu, Mandriva lo instalaremos con el gestor de instalacion que tengamos.

En el caso de Puppy lo que tendremos que tener instalado es el archivo de  devx_xxxx.sfs cargado que nos permite no solamente programar en python, asi como en C, ensamblador, c++, perl, y un largo etc..

Pero ademas de una vez instalado pytho  debemos instalar el paquete.  pyserial que en mi caso me baje la version pyserial-2.7

Bajarse el paquete : pyserial-2.7.tar.gz  del enlace:

https://pypi.python.org/pypi/pyserial

Descomprimirlo y del directorio que se crea  el directorio  pyserial-2.7 meterse dentro
y dentro de este directorio ejecutar la orden :

python setup.py install

Con esto hace la instalacion del modulo  serial para python.
Si queremos comprobar como funciona hacemos lo siguiente:
Nos metemos dentro del terminal de python tecleando :

# python

una vez dentro:

# import serial

# s = serial.Serial(‘/dev/ttyUSB0’, 115200 )

Hacer notar que yo utilizo un cable  USB convertidor de USB a RS232, aunque el ordenador que trabajo tiene puerto serie hoy en dia los ordenadores modernos ya no lo traen, con lo cual es necesario disponer de un cable de esto que por otro lado son muy baratos.

Si nos metemos en el directorio  /dev  veremos que nada mas conectar el cable  USB-RS232 al ordenador se nos aparece un archivo  ttyUSB0  y este archivo corresponde a este dispositivo, recordar que Linux utiliza todo como si fueran archivos.

Si conectaramos otro cable USB-RS232  nos apareceria otro archivo ttyUSB1 y asi sucesivamente.

Decir que los puertos serie de los ordenadores antiguos corresponden a los archivos  ttyS0 , ttyS1 , ttyS0  , o lo que corresponderia en linux los puertos Com0, Com1, Com2 etc..

Bueno contiuando con lo anterior al ejecutar la orden: s = serial.Serial(‘/dev/ttyUSB0’, 115200 )

Esto nos abre el puerto serie de cable USB0 a RS232 y con una velocidad de 115200

Cogemos el polimetro y medimos entre masa y la patita 4 correspondiente a DTR y tecleamos:

# s.setDTR(False)

y veremos que la tension en la patita es de -6 v aproximadamente y luego tecleamos

# s.setDTR(True)

y veremos que la tension en la patita es de +6 v aproximadamente y luego tecleamos

Buen pues con todo esto ya tenemos un control total sobre el puerto serie por que podemos
enviar y recibir bytes enteros, y tener control individual sobre las lineas:

DTR, CTS, RTS, DSR , RI y CD

pines

Mediante la orden  getCTS(), getDSR(), getRI() y getCD() conseguimos los estados  de las entradas.

Si por ejemplo cogemos un conector hembra para de puerto Serie y soldamos un cablecito fino entre la patita 4 que es la salida DTR y la patita 6 que es una entrada DSR, conectamos el conector hembra al conector macho del cable USB-RS232 y tecleamos las siguientes ordenes:

# s.setDTR(False)

Esto hara que nos aparezca una tension positiva entre la patita 4 y masa que puede oscilar entre +3 y +12 V aproximadamente, esta tension como tenemos echo el puente con la patita 6 se nos mete en esta entrada, si ahora tecleamos la orden:

# s.getDSR()     Veremos que nos responde:

# False 

Por que considera que este estado es falso.

Si ahora tecleamos la orden:

# s.setDTR(True)

Y de nuevo ejecutamos seguido la orden:

# s.getDSR()     Veremos que nos responde:

# True 

Por que si ahora medimos la tension entre  la patita 4 y masa aparece una tension negativa que puede oscilar entre -3 y -12 V que es lo que considera que es un valor alto.

Y algunos se pueden estar preguntando para que quiero yo controlar el puerto serie a nivel de pines, bueno pues se pueden hacer circuitos muy interesantes y sencillos a niveles de pines, sin necesidad de utilizar el famoso max232, y ningun microcontrolador posterior.

Aunque si efectivamente se tiene mucho mas control y mucha mas versatilidad utilizando el puerto serie con un microcontrolador.

No obstante ahora mas adelante vamos a ver como enviar y recibir datos enteros o bytes atraves del puerto serie.

Pero por ejemplo utilizando de esta forma y mediante registros de desplazamiento podriamos crear buffer de datos  a transmitir o recibir por el puerto serie del tamaño que queramos,  8, 16 o mas bits.

Sin necesidad de crear una circuiteria muy compleja.

Yo tenia un articulo antiguo que mediante este metodo hacia contadores, capacimetro etc… si bien era mediante Visual Basic de Windows.

Bueno ahora vamos a probar el envio de bytes completos atraves del puerto serie, para ello sin salirnos del terminal de python que tenemos abierto, le quitamos al conector DB9 el puente que teniamos echo entre la patita 4 y la 6.

Teniendo puesto el conector hembra enchuado sobre la salida del conector macho del cable USB-DB9 tecleamos en una sola linea y digo que solo en una sola linea continua la siguiente orden:

>>>  s.timeout = 2 ;  text = “Hola” ;  s.write(text) ;  val = s.read(4) ;  print “Enviado:     ” +  val  ;

Apretamos Enter y nos tarda dos segundos en darnos la respuesta

4

Enviado

Pero de la cadena enviada nada,  pero si ahora apretamos la tecla de la flechita hacia arriba nos aparece la misma orden sin que la tengamos que escribir, pero esta vez con la punta del destornillador hacemos un cortocircuito entre la patitas 2 y 3 que asoman por detras del conector hembra DB9 , (comprobar que efectivamente son las patitas 2 y 3 ) y como digo con la tecla de flecha arriba volvemos a sacar la orden:

>>>  s.timeout = 2 ;  text = “Hola” ;  s.write(text) ;  val = s.read(4) ;  print “Enviado:     ” +  val  ;

Apretamos de nuevo enter y con el cortocircuito mantenido sobre las patitas 2 y 3 vemos.

4

Enviado Hola

Como se puede comprender hemos  conectado la salida del puerto serie a la entrada de datos y ahora si los recibe claramente, la explicacion a la funcion:

>>>  s.timeout = 2 ;  text = “Hola” ;  s.write(text) ;  val = s.read(4) ;  print “Enviado:     ” +  val  ;

es la siguiente:

s.timeout =2        Hace un t imeout de 2 segundos si  a los dos segundos no llega ningun dato entonces se sale de la recepcion de datos por el puerto serie, si no hicieramos esto se quedaria en espera todo el rato y entonces tendriamos que hacer un   Ctr + C para poder salir de esa situacion engorrosa.

text=”Hola”   asigna un texto de cuatro letras a la variable text

hl  Envia el texto por el puerto serie.

val=s.read(4)  Recibe el texto enviado y le decimos que ese texto tiene 4 bytes esto es interesante para que no espere mas.

print “Enviado:    ” + val        Prensenta en el terminal el texto recibido.

Bueno hasta aqui es todo con python mas adelante pondre mas adelante, aunque yo uso de forma mas habitual para el puerto C programacion en C por cuestion unicamente de costrumbre.

saludos

Anuncios

4 Comentarios

    • Bueno tanto en Python como Java tienes muy buena compatibilidad para luego transportarlos a otros sistemas operativos, como windows o Linux.

      Yo utilizo principalmente ahora en C por que hago suprogramas para luego poder ser utilizado por cualquiera de los herramientas de desarrollo que queramos desarrollar, Java, Pyton, Gambas, Gtdialog, Tcl, etc..

      Va en gustos pero para mi me da mucho mas control sobre muchos procesos, si bien la programacion que yo hago esta pensada para Linux, sin fines comerciales y para controlar distintos particulares que voy realizando.

      En cualquier caso cualquiera de los sistemas que eligas, lleva mucho esfuerzo el conseguir aprenderlo y llegar mas o menos controlarlo, pero como todo en esta vida poco a poco.

      Un saludo.

  1. Cualquier metodo es bueno, y python esta bien, ademas si el programa de aplicacion tambien lo haces en python pues mejor que mejor.

    Yo normalmente el control del puerto lo hago en C y luego el programa de aplicacion en por otros metodos, como Gambas, Gtkdialog.

    Pero hay varias medios para hacerlo.

    Todo esto es valido tanto si utilizas un puerto serie del PC que en linux se definen como ttyS0, ttyS1…etc..

    Como cables convertidores USB-RS232 que vienen definidos normalmente como ttyUSB0, ttyUSB1…etc..

    Y tambien te valen para tarjetas de desarrollo como Arduino, freenode, etc..

    Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s