seriales - python serial read arduino
¿Cuál es el método multiplataforma de enumerar puertos serie en Python(incluidos los puertos virtuales)? (4)
¿La función pyserial, serial.tools.list_ports , le proporciona lo que desea?
Nota: Estoy usando Python 2.7 y pySerial para comunicaciones serie.
Encontré este artículo que enumera dos formas: http://www.zaber.com/wiki/Software/Python#Displaying_a_list_of_available_serial_ports
Este método funciona en Windows y Linux, pero a veces se pierden los puertos virtuales en Linux:
import serial
def scan():
# scan for available ports. return a list of tuples (num, name)
available = []
for i in range(256):
try:
s = serial.Serial(i)
available.append( (i, s.portstr))
s.close()
except serial.SerialException:
pass
return available
print "Found ports:"
for n,s in scan(): print "(%d) %s" % (n,s)
Y este que solo funciona en Linux, pero incluye puertos virtuales:
import serial, glob
def scan():
# scan for available ports. return a list of device names.
return glob.glob(''/dev/ttyS*'') + glob.glob(''/dev/ttyUSB*'')
print "Found ports:"
for name in scan(): print name
Supongo que podría hacer detección de plataforma para usar el segundo método (el que incluye puertos virtuales) cuando se ejecuta en Linux, y el primer método cuando ejecuto Windows, pero ¿qué pasa con Mac?
¿Cómo debo enumerar los puertos serie (también virtuales) independientemente de la plataforma?
Editar
Encontré algunas preguntas pertinentes:
Esto es lo que he estado usando. Es una mezcla de los métodos que publiqué arriba. Sin embargo, me gustaría ver mejores soluciones.
# A function that tries to list serial ports on most common platforms
def list_serial_ports():
system_name = platform.system()
if system_name == "Windows":
# Scan for available ports.
available = []
for i in range(256):
try:
s = serial.Serial(i)
available.append(i)
s.close()
except serial.SerialException:
pass
return available
elif system_name == "Darwin":
# Mac
return glob.glob(''/dev/tty*'') + glob.glob(''/dev/cu*'')
else:
# Assume Linux or something else
return glob.glob(''/dev/ttyS*'') + glob.glob(''/dev/ttyUSB*'')
No sé si todavía está buscando respuestas a esto, pero dado que tengo una solución de trabajo, pensé en publicarla. Aquí está el paquete de getports como parte de mi proyecto Arduino Data Logger. Lo he probado para trabajar en Mac, al menos algunos sabores de Linux y Windows 7. A diferencia del comscan de bitpim, no usa ningún módulo que no provenga de la biblioteca estándar. Además, no usa /dev
globbing en Linux o Mac, por lo que cambiar el nombre de las reglas no debería ser un problema. (En Linux usa sysfs y en Mac usa IOKit.) No sé si detecta puertos serie virtuales en Linux, pero si no lo hace, intente reemplazarlo
sys_suffix = ''/device/''
con
sys_suffix = ''''
en linuxgetports.py
bitpim tenía bastante código para comscan en múltiples plataformas. Probablemente sea útil para obtener un código de allí para construir un enumerador de puerto serie multiplataforma. Puede ejecutar el código de detección directamente en la línea de comando para probarlo.
bitpim.svn.sourceforge.net/viewvc/bitpim/trunk/bitpim/src/… .
En Linux, no pareció detectar los puertos ''/ dev / ttyS''. Agregando la siguiente línea debajo de la línea # 378 trabajó:
("/dev/ttyS", "Standard Serial Port", "serial"),
El autor ha facilitado la adición de diferentes tipos de identificadores para puertos serie.
En Mac, funcionó bien. (Tenía un Arduino a mano para probar)
En Windows, detectó con éxito el puerto conectado (para el conector FTDI conectado). Requiere pywin32 .
Con pyserial , intenté lo siguiente:
python -m serial.tools.list_ports
No parece funcionar en Windows. Funciona en Mac. Funciona en Linux.
Es interesante ver la sección Plataforma en la documentación de este comando :
Platform : Posix (/dev files)
Platform : Linux (/dev files, sysfs and lsusb)
Platform : Windows (setupapi, registry)
Creo que una fusión de los dos debería dar un enumerador de puerto (casi) 100% confiable.
Editar : Intenté todo lo anterior en Python 2.7.