{"library":"pyserial-asyncio","title":"pySerial-asyncio","description":"pySerial-asyncio is an asynchronous I/O extension for the Python Serial Port package (pySerial). It provides support for working with serial ports through asyncio Transports, Protocols, and Streams. Compatible with Python 3.5 and later, it depends on pySerial. The current version is 0.6. The project appears to be in maintenance mode, with no new releases since 2021, and a fork `pyserial-asyncio-fast` addressing some critical issues.","language":"python","status":"maintenance","last_verified":"Sat May 16","install":{"commands":["pip install pyserial-asyncio"],"cli":null},"imports":["import serial_asyncio","from serial_asyncio import open_serial_connection","from serial_asyncio import create_serial_connection"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import asyncio\nimport os\nimport serial_asyncio\n\nasync def main():\n    # For testing, use a virtual serial port like 'loop://'.\n    # On Linux, you can create virtual ports using 'socat -d -d pty,raw,echo=0 pty,raw,echo=0'.\n    # Replace 'loop://' with your actual port (e.g., '/dev/ttyUSB0' or 'COM1').\n    port = os.environ.get('SERIAL_PORT', 'loop://')\n    baudrate = int(os.environ.get('SERIAL_BAUDRATE', '115200'))\n\n    print(f\"Attempting to open serial port {port} at {baudrate} baud...\")\n    try:\n        # open_serial_connection returns (StreamReader, StreamWriter)\n        reader, writer = await serial_asyncio.open_serial_connection(url=port, baudrate=baudrate)\n        print(\"Serial port opened successfully.\")\n    except Exception as e:\n        print(f\"Failed to open serial port: {e}\")\n        return\n\n    try:\n        message = b\"Hello pySerial-asyncio!\\n\"\n        print(f\"Sending: {message.decode().strip()}\")\n        writer.write(message)\n        await writer.drain() # Crucial to ensure data is sent\n\n        print(\"Waiting for response...\")\n        response = await reader.readline() # Read until newline\n        print(f\"Received: {response.decode().strip()}\")\n\n    except Exception as e:\n        print(f\"Error during serial communication: {e}\")\n    finally:\n        print(\"Closing serial port...\")\n        writer.close()\n        await writer.wait_closed()\n        print(\"Serial port closed.\")\n\nif __name__ == '__main__':\n    asyncio.run(main())","lang":"python","description":"This example demonstrates how to open an asynchronous serial connection using `open_serial_connection`, send data, and read a response. It uses environment variables for port and baudrate to allow easy testing with virtual or real serial ports. The `writer.drain()` call is essential to ensure buffered data is transmitted.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"0.6","pypi_latest":"0.6","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.6,"avg_import_s":0.2,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.08,"mem_mb":4.2,"disk_size":"18.5M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.06,"mem_mb":4.2,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.16,"mem_mb":5.1,"disk_size":"20.5M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.14,"mem_mb":5.1,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.37,"mem_mb":8.2,"disk_size":"12.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.32,"mem_mb":8.2,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.37,"mem_mb":8.7,"disk_size":"12.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.33,"mem_mb":8.7,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.08,"mem_mb":4.1,"disk_size":"18.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyserial-asyncio","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.07,"mem_mb":4,"disk_size":"19M"}]}}