Descripción general
El script está diseñado para interactuar con un dispositivo serial, permitiendo
a los usuarios enviar comandos y recibir respuestas a través de un puerto serial
especificado. Utiliza la librería pyserial para la comunicación serial e incluye
logging para monitorear el proceso.
Funciones
- El script proporciona una interfaz de línea de comandos simple para
interactuar con un dispositivo serial.
- Permite a los usuarios enviar comandos y recibir respuestas, con logging para
rastrear el proceso de comunicación.
- El uso de argumentos de línea de comandos lo hace flexible para diferentes
configuraciones y comandos seriales.
Ejemplo
#!/usr/bin/env python
import serial
import time
import argparse
import logging
import sys
def setup_logging():
""" Configura el formato de logging. """
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def parse_arguments():
""" Analiza los argumentos de la línea de comandos. """
parser = argparse.ArgumentParser(description="Interactúa con un dispositivo serial.")
parser.add_argument("--port", default="/dev/pts/5", help="Puerto serial al que conectarse.")
parser.add_argument("--baud", type=int, default=115200, help="Baud rate para la conexión serial.")
parser.add_argument("--timeout", type=float, default=0.5, help="Timeout de lectura para la conexión serial.")
parser.add_argument("--cmd", type=str, default=None, help="Comando a enviar al dispositivo.")
return parser.parse_args()
def main():
""" Función principal para ejecutar el script. """
setup_logging()
args = parse_arguments()
try:
# Inicializa la conexión serial
device = serial.Serial(args.port, args.baud, timeout=args.timeout)
except serial.SerialException as e:
logging.error(f"No se pudo abrir el puerto serial: {e}")
sys.exit(1)
logging.info(f"Dispositivo serial abierto: port={args.port}, baud={args.baud}, timeout={args.timeout}")
while True:
try:
# Obtiene la entrada del usuario
if args.cmd is None:
data_to_send = input("Introduce los datos a enviar: ")
else:
data_to_send = args.cmd
logging.info(f"Enviando: {args.cmd}")
# Envía los datos
device.write((data_to_send + '\r').encode())
tic = time.time()
# Lee la respuesta
incoming_data = device.read_until(b'\r').decode().strip()
toc = time.time()
logging.info(f"Recibido: {incoming_data} ({1000*(toc-tic):.3f}ms)")
time.sleep(0.5)
except KeyboardInterrupt:
logging.info("Saliendo...")
break
except Exception as e:
logging.error(f"Error: {e}")
if __name__ == "__main__":
main()