Post by Lisandro LanfrancoHola a todos, tengo instalado ubuntu 10.04 en una máquina por la que
quiero enviar y recibir datos por el puerto serie con un programa en
python.
Probé asignándole permisos de lectura y escritura al archivo /dev/ttyS0
y luego ejecutando: echo 'a'> /dev/ttyS0 y todas las demás pruebas
posibles para enviar un caracter de prueba por el puerto serie, sin
conseguirlo. El hardware con el microcontrolador está funcionando bien
pero no recibe nada.
Alguna idea?
Un saludo
--
Para cancelar o configurar su suscripción, visite
http://mx.grulic.org.ar/list o envíe un email a
I am the one who is many.
Hola Lisandro, te envio dos scripts que me han sido utiles:
scan.py
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
#----------------------------------------------------------------------------
# scan.py Modulo para obtener una lista de los puertos series disponibles
#----------------------------------------------------------------------------
# Notas: En Linux solo se detectan los puertos del tipo /dev/ttySx
# disponibles, que son a los que la libreria pyserial les asigna los
# valores 0, 1, 2, etc. Los dispositivos del tipo /dev/ttyUSBx no se
# detectan. Para poder usarlos como cualquier otro dispositivo, se
# puede hacer un enlace simbolico:
# # ln -s /dev/ttyUSB0 /dev/ttyS10
# Asociamos el dispositivo ttyUSB0 a uno del tipo ttyS10. En ese caso si
# se detecta correctamente con esta rutina. En este ejemplo devolveria el
# valor 10 (si realmente en /dev/ttyUSB0 hay un conversor usb-serie)
#----------------------------------------------------------------------------
#
# (C)2002 Chris Liechti (cliechti-***@public.gmane.org)
# (C)2007 Juan Gonzalez
#
# LICENCIA GPL
#----------------------------------------------------------------------------
import sys
import serial
#-----------------------------------------------------------------------------
# Buscar puertos series disposibles.
# ENTRADAS:
# -num_ports : Numero de puertos a escanear. Por defecto 20
# -verbose : Modo verboso True/False. Si esta activado se va
# imprimiendo todo lo que va ocurriendo
# DEVUELVE:
# Una lista con todos los puertos encontrados. Cada elemento de la lista
# es una tupla con el numero del puerto y el del dispositivo
#-----------------------------------------------------------------------------
def scan(num_ports = 20, verbose=True):
#-- Lista de los dispositivos serie. Inicialmente vacia
dispositivos_serie = []
if verbose:
print "Escanenado %d puertos serie:" % num_ports
#-- Escanear num_port posibles puertos serie
for i in range(num_ports):
if verbose:
sys.stdout.write("puerto %d: " % i)
sys.stdout.flush()
try:
#-- Abrir puerto serie
s = serial.Serial(i)
if verbose: print "OK --> %s" % s.portstr
#-- Si no hay errores, anadir el numero y nombre a la lista
dispositivos_serie.append( (i, s.portstr))
#-- Cerrar puerto
s.close()
#-- Si hay un error se ignora
except:
if verbose: print "NO"
pass
#-- Devolver la lista de los dispositivos serie encontrados
return dispositivos_serie
#--------------------------
# Pruebas del modulo Scan
#--------------------------
if __name__=='__main__':
#-- Escanear los puertos.
#-- Se puede indicar el numero de puertos a escaner
#-- El modo "verbose" esta activado por defecto. Se desactiva con False
puertos_disponibles=scan(num_ports=20,verbose=True)
#-- Recorrer la lista mostrando los que se han podido abrir
print ""
print "Puertos detectados:"
if len(puertos_disponibles)!=0:
for n,nombre in puertos_disponibles:
print " (%d) %s" % (n,nombre)
else:
print " Ninguno"
----------------------------------------------------------------------------
Y aca va otro mas:
#! /usr/bin/python
#---------------------------------------------------------------------------
#-- (C)2002-2004 Chris Liechti <cliecht-***@public.gmane.org>
#-- (C)2007 Juan Gonzalez
#--
#-- Miniterminal de comunicaciones en Python para hacer prueas
#--
#-- LICENCIA GPL
#---------------------------------------------------------------------------
import sys
import getopt
import serial
import consola_io
import threading
#-- Caracter empleado para salir del terminarl
EXITCHARCTER = '\x04' #ctrl+D
#-- Variable para indicar al thread que termine
fin = 0
#-----------------------------------------------------------------------------
#-- Este thread se ejecuta infinitamente. Esta todo el rato leyendo datos
#-- del puerto serie y sacandolos por la consola
#-----------------------------------------------------------------------------
def reader():
#-- Cuando fin=1 se termina el thread
while not(fin):
try:
data = s.read()
sys.stdout.write(data)
sys.stdout.flush()
except:
print "Excepcion: Abortando..."
break;
#-------------------------------------------------------------------------
#-- Este es el bucle principal. Todos los caracteres que llegan por la
#-- consola se envian por el puerto serie
#-------------------------------------------------------------------------
def writer():
while 1:
try:
#-- Esperar a que se pulse una tecla
c = consola_io.getkey()
#-- Si es la tecla de fin se termina
if c == EXITCHARCTER:
break
else:
#-- Enviar tecla por el puerto serie
s.write(c)
except: #-- Si se ha pulsado control-c terminar
print "Abortando..."
break
#--------------------------------
#-- Imprimir mensaje de ayuda
#--------------------------------
def help():
sys.stderr.write("""Uso: miniterm [opciones]
Miniterminal de comunicaciones en python
opciones:
-p, --port=PORT: Puerto serie a emplear. Bien un numero o una cadena
Ejemplo:
miniterm -p 0 --> Usar el primer puerto serie (Linux/Windos)
miniterm -p /dev/ttyS1 --> Especificar el dispositivo serie (Linux)
""")
#-----------------------------------------------------
#-- Analizar los argumentos pasados por el usuario
#-----------------------------------------------------
def Analizar_argumentos():
#-- Valor por defecto del puerto a usar
Puerto = 0
try:
opts, args = getopt.getopt(sys.argv[1:],
"hp:",
["help", "port="]
)
except getopt.GetoptError:
# print help information and exit:
help()
sys.exit(2)
#-- Leer argumentos pasados
for o, a in opts:
if o in ("-h", "--help"):
help()
sys.exit()
elif o in ("-p", "--port"): #specified port
try:
Puerto = int(a)
except ValueError:
Puerto = a
return Puerto
#----------------------
# MAIN
#----------------------
#-- Analizar los argumentos pasados por el usuario
Puerto=Analizar_argumentos()
#--------------------------------------
#-- Abrir el puerto serie
#--------------------------------------
try:
s = serial.Serial(Puerto, 9600)
#-- Timeout: 1 seg
s.timeout=1;
except serial.SerialException:
#-- Error al abrir el puerto serie
sys.stderr.write("Error al abrir puerto: " + str(Puerto))
sys.exit(1)
print ("Puerto serie (%s): %s") % (str(Puerto),s.portstr)
print ("--- Miniterm --- Ctrl-D para terminar\n")
#-- Lanzar el hilo que lee del puerto serie y saca por pantalla
r = threading.Thread(target=reader)
r.start()
#-- Ejecutar el bucle principal. Lee de la consola y envia por el puerto
#-- serie
writer()
#-- Indicar al trhead the termine y esperar
fin=1
r.join()
#-- Fin del programa
print "\n"
print "--- Fin ---"
#-- Cerrar puerto serie.
s.close()
------------------------------------------------------------------------------------
Asegurate de tener instalado python-serial
Espero haberte sido útil.
Cordiales saludos,
Alejandro.
--
Para cancelar o configurar su suscripción, visite
http://mx.grulic.org.ar/list o envíe un email a
grulic-request-od3Ii2+oAupd+***@public.gmane.org
I am the one who is many.