42. Tema 2.3: PY RS232-Instalación de la Librería
Tutorial: Instalación y Configuración de PySerial para Comunicación RS232
1. Introducción a PySerial
PySerial es una librería Python que permite la comunicación serial (RS232/RS485) con dispositivos como:
Puertos serie tradicionales (COM1, COM2)
Conversores USB a Serial
Dispositivos industriales con interfaz RS232
Equipos de medición y control
2. Prerrequisitos
Antes de comenzar, asegúrate de tener:
Python 3.6 o superior instalado
Acceso a terminal/consola (CMD, PowerShell, Terminal)
Conexión a internet para descargar la librería
3. Métodos de Instalación
Método 1: Usando pip (Recomendado)
# Instalación básica
pip install pyserial
# Instalación específica de versión
pip install pyserial==3.5
# Si tienes múltiples versiones de Python
python -m pip install pyserial
pip3 install pyserial
# Actualizar a la última versión
pip install --upgrade pyserialMétodo 2: Usando conda
conda install -c conda-forge pyserialMétodo 3: Instalación manual
# 1. Descargar desde PyPI
https://pypi.org/project/pyserial/
# 2. Instalar desde archivo .whl
pip install pyserial-3.5-py2.py3-none-any.whl
# 3. O desde el código fuente
python setup.py install4. Verificación de la Instalación
Verificar que se instaló correctamente:
# En la consola de Python
import serial
print(serial.__version__)
# O desde la terminal
python -c "import serial; print(serial.__version__)"Listar puertos disponibles:
import serial.tools.list_ports
# Listar todos los puertos
ports = serial.tools.list_ports.comports()
for port, desc, hwid in sorted(ports):
print(f"{port}: {desc} [{hwid}]")5. Primer Programa de Prueba
Código básico de conexión:
import serial
import time
try:
# Configurar conexión serial
ser = serial.Serial(
port='COM3', # Puerto (Windows)
# port='/dev/ttyUSB0', # Puerto (Linux)
# port='/dev/ttyACM0', # Puerto (Mac)
baudrate=9600, # Velocidad en baudios
bytesize=8, # Bits de datos
parity='N', # Paridad (N=none, E=even, O=odd)
stopbits=1, # Bits de parada
timeout=1 # Timeout en segundos
)
print(f"Conexión establecida en {ser.port}")
# Enviar datos
ser.write(b'Hello RS232!\n')
print("Datos enviados")
# Leer respuesta (si existe)
time.sleep(0.1)
if ser.in_waiting:
response = ser.readline()
print(f"Respuesta recibida: {response.decode('utf-8').strip()}")
# Cerrar conexión
ser.close()
print("Conexión cerrada")
except serial.SerialException as e:
print(f"Error: {e}")6. Solución de Problemas Comunes
Problema 1: "ModuleNotFoundError: No module named 'serial'"
Solución:
# Asegúrate de que pip está actualizado
python -m pip install --upgrade pip
# Reinstalar PySerial
pip uninstall pyserial
pip install pyserialProblema 2: Puerto no encontrado
Solución:
# Detectar puertos automáticamente
import serial.tools.list_ports
available_ports = []
ports = list(serial.tools.list_ports.comports())
for p in ports:
available_ports.append(p.device)
print("Puertos disponibles:", available_ports)Problema 3: Permisos en Linux/Mac
Solución:
# Agregar usuario al grupo dialout
sudo usermod -a -G dialout $USER
# O cambiar permisos del puerto
sudo chmod 666 /dev/ttyUSB0
# Reiniciar sesión para aplicar cambios7. Configuración Avanzada
Configuración de timeouts:
ser = serial.Serial(
port='COM3',
baudrate=115200,
timeout=0.5, # Timeout de lectura
write_timeout=0.5, # Timeout de escritura
inter_byte_timeout=0.1 # Timeout entre bytes
)Configuración de control de flujo:
ser = serial.Serial(
port='COM3',
baudrate=9600,
rtscts=True, # Hardware flow control
dsrdtr=True # Data Set Ready/Data Terminal Ready
)8. Ejemplo Completo - Monitor Serial
import serial
import threading
import time
class SerialMonitor:
def __init__(self, port, baudrate=9600):
self.ser = serial.Serial(port, baudrate, timeout=1)
self.running = True
self.thread = threading.Thread(target=self.read_serial)
def start(self):
print(f"Iniciando monitor en {self.ser.port}")
self.thread.start()
def read_serial(self):
while self.running:
if self.ser.in_waiting:
data = self.ser.read(self.ser.in_waiting)
print(f"RX: {data.hex()} | ASCII: {data.decode('ascii', errors='ignore')}")
time.sleep(0.01)
def send_data(self, data):
if isinstance(data, str):
data = data.encode()
self.ser.write(data)
print(f"TX: {data.hex()}")
def stop(self):
self.running = False
self.thread.join()
self.ser.close()
print("Monitor detenido")
# Uso del monitor
if __name__ == "__main__":
monitor = SerialMonitor('COM3', 9600)
monitor.start()
try:
while True:
monitor.send_data("PING\n")
time.sleep(2)
except KeyboardInterrupt:
monitor.stop()9. Recursos Adicionales
Documentación oficial:
Instalación de controladores:
Windows: Detecta automáticamente la mayoría de conversores USB-Serial
Linux: Generalmente incluidos en el kernel
Mac: Instalar desde FTDI VCP Drivers
Herramientas útiles:
Putty (Windows) - Cliente serial genérico
screen (Linux/Mac) -
screen /dev/ttyUSB0 9600Arduino IDE - Incluye monitor serial
10. Próximos Pasos
Probar con dispositivos reales (Arduino, PLC, etc.)
Implementar protocolos específicos (Modbus, NMEA, etc.)
Crear interfaz gráfica con Tkinter o PyQt
Implementar logging de datos
Nota: Recuerda siempre cerrar las conexiones seriales con .close() para liberar el puerto y evitar conflictos. ¡Feliz programación serial! 🚀
Comentarios
Publicar un comentario