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

serial_api_client.py

#!/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()