Skip to main content

Python bindings for a C++ serial port library

Project description

https://github.com/Lei-k/async-pyserial/actions/workflows/python-publish.yml/badge.svg https://github.com/Lei-k/async-pyserial/actions/workflows/docs-publish.yml/badge.svg https://codecov.io/gh/Lei-k/async-pyserial/branch/main/graph/badge.svg

Python bindings for a C++ serial port library providing asynchronous serial communication support.

Features

  • Non-blocking and blocking read/write operations.

  • Cross-platform support for Windows, Linux, macOS, and FreeBSD.

  • Event-driven architecture for handling data events.

  • Support for gevent, eventlet, asyncio, callback, and synchronous operations.

  • Uses epoll, iocp, and kqueue for efficient, scalable I/O operations based on the underlying operating system.

Installation

You can install the async-pyserial package using either poetry or pip.

### Using Poetry

  1. Install poetry if you haven’t already:

    curl -sSL https://install.python-poetry.org | python3 -
  2. Add async-pyserial to your project:

    poetry add async-pyserial

### Using pip

  1. Install the package from PyPI:

    pip install async-pyserial

### FreeBSD Installation

For FreeBSD, you need to build the package manually:

  1. Clone the repository:

    git clone https://github.com/Lei-k/async-pyserial.git
  2. Navigate to the project directory:

    cd async-pyserial
  3. Install the dependencies using poetry:

    poetry install
  4. Build the package:

    python -m build
  5. Install the package:

    pip install dist/*.whl

Usage

Here’s a simple example of how to use async-pyserial:

from async_pyserial import SerialPort, SerialPortOptions, SerialPortEvent, SerialPortParity

def on_data(data):
    print(f"Received: {data}")

options = SerialPortOptions()
options.baudrate = 9600
options.bytesize = 8
options.stopbits = 1
options.parity = SerialPortParity.NONE # NONE, ODD, EVEN

serial_port = SerialPort('/dev/ttyUSB0', options)
serial_port.on(SerialPortEvent.ON_DATA, on_data)
serial_port.open()

try:
    while True:
        data_to_send = input("Enter data to send (or 'exit' to quit): ")
        if data_to_send.lower() == 'exit':
            break
        serial_port.write(data_to_send.encode('utf-8'))
finally:
    serial_port.close()

API

### SerialPort A class for serial communication.

#### Methods

  • __init__(self, port: str, options: SerialPortOptions): Initializes the serial port with the specified parameters.

  • def write(self, data: bytes, callback: Callable | None = None): Writes data to the serial port. Can be blocking or non-blocking. If a callback is provided, the write will be asynchronous. Supports gevent, eventlet, asyncio, callback, and synchronous operations.

  • def read(self, bufsize: int = 512, callback: Callable | None = None): Reads data from the serial port. Can be blocking or non-blocking. If a callback is provided, the read will be asynchronous. Supports gevent, eventlet, asyncio, callback, and synchronous operations.

  • def open(self): Opens the serial port.

  • def close(self): Closes the serial port.

  • def on(self, event: SerialPortEvent, callback: Callable[[bytes], None]): Registers a callback for the specified event.

  • def emit(self, evt: str, *args, **kwargs): Emits an event, triggering all registered callbacks for that event.

  • def remove_all_listeners(self, evt: str): Removes all listeners for the specified event.

  • def remove_listener(self, evt: str, listener: Callable): Removes a specific listener for the specified event.

  • def off(self, evt: str, listener: Callable): Alias for remove_listener.

### SerialPortOptions A class for specifying serial port options.

#### Attributes

  • baudrate: int: The baud rate for the serial port.

  • bytesize: int: The number of data bits.

  • stopbits: int: The number of stop bits.

  • parity: int: The parity checking (0: None, 1: Odd, 2: Even).

  • read_timeout: int: The read timeout in milliseconds.

  • write_timeout: int: The write timeout in milliseconds.

  • read_bufsize: int: The read buffer size. Default is 0. When read_bufsize is 0, the internal buffer is not used, and only data received after the read call will be returned. If read_bufsize is not 0, both buffered and new data will be returned.

### SerialPortEvent An enumeration for serial port events.

  • ON_DATA: Event triggered when data is received.

### SerialPortError An exception class for handling serial port errors.

  • __init__(self, *args: object): Initializes the SerialPortError with the specified arguments.

### PlatformNotSupported An exception class for handling unsupported platforms.

  • __init__(self, *args: object): Initializes the PlatformNotSupported exception with the specified arguments.

### set_async_worker A function for setting the asynchronous worker.

  • def set_async_worker(w: str, loop = None): Sets the asynchronous worker to gevent, eventlet, or asyncio. Optionally, an event loop can be provided for asyncio.

Examples

The examples directory contains sample scripts demonstrating how to use async-pyserial for various operations. Below are a few examples to help you get started.

  • Basic read and write operations.

  • Non-blocking read with asyncio.

  • Using gevent and eventlet for asynchronous operations.

Example scripts included in the examples directory:

  • interval_write.py: Demonstrates periodic writing to the serial port.

  • serialport_read.py: Demonstrates reading from the serial port with different async workers.

  • serialport_terminal.py: A terminal interface for interacting with the serial port.

Platform Support

Supports Windows, Linux, macOS, and FreeBSD.

Development

To contribute to the project, follow these steps:

  1. Clone the repository:

    git clone https://github.com/Lei-k/async-pyserial.git
  2. Navigate to the project directory:

    cd async-pyserial
  3. Install the dependencies using poetry:

    poetry install
  4. Run the tests:

    poetry run pytest

License

This project is licensed under the MIT License. See the LICENSE file for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

async_pyserial-0.2.1.tar.gz (22.2 kB view hashes)

Uploaded Source

Built Distributions

async_pyserial-0.2.1-pp310-pypy310_pp73-win_amd64.whl (88.7 kB view hashes)

Uploaded PyPy Windows x86-64

async_pyserial-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (156.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl (96.2 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

async_pyserial-0.2.1-pp39-pypy39_pp73-win_amd64.whl (88.5 kB view hashes)

Uploaded PyPy Windows x86-64

async_pyserial-0.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (156.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl (96.2 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

async_pyserial-0.2.1-pp38-pypy38_pp73-win_amd64.whl (88.5 kB view hashes)

Uploaded PyPy Windows x86-64

async_pyserial-0.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (156.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl (96.2 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

async_pyserial-0.2.1-cp312-cp312-win_amd64.whl (90.4 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

async_pyserial-0.2.1-cp312-cp312-win32.whl (81.8 kB view hashes)

Uploaded CPython 3.12 Windows x86

async_pyserial-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl (2.3 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

async_pyserial-0.2.1-cp312-cp312-musllinux_1_2_i686.whl (2.4 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

async_pyserial-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-cp312-cp312-macosx_11_0_arm64.whl (105.5 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

async_pyserial-0.2.1-cp311-cp311-win_amd64.whl (90.4 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

async_pyserial-0.2.1-cp311-cp311-win32.whl (81.8 kB view hashes)

Uploaded CPython 3.11 Windows x86

async_pyserial-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl (2.3 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

async_pyserial-0.2.1-cp311-cp311-musllinux_1_2_i686.whl (2.4 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

async_pyserial-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (106.3 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

async_pyserial-0.2.1-cp310-cp310-win_amd64.whl (89.3 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

async_pyserial-0.2.1-cp310-cp310-win32.whl (81.0 kB view hashes)

Uploaded CPython 3.10 Windows x86

async_pyserial-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl (2.3 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

async_pyserial-0.2.1-cp310-cp310-musllinux_1_2_i686.whl (2.4 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

async_pyserial-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-cp310-cp310-macosx_11_0_arm64.whl (105.0 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

async_pyserial-0.2.1-cp39-cp39-win_amd64.whl (88.4 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

async_pyserial-0.2.1-cp39-cp39-win32.whl (81.1 kB view hashes)

Uploaded CPython 3.9 Windows x86

async_pyserial-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl (2.3 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

async_pyserial-0.2.1-cp39-cp39-musllinux_1_2_i686.whl (2.4 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

async_pyserial-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-cp39-cp39-macosx_11_0_arm64.whl (105.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

async_pyserial-0.2.1-cp38-cp38-win_amd64.whl (89.3 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

async_pyserial-0.2.1-cp38-cp38-win32.whl (80.9 kB view hashes)

Uploaded CPython 3.8 Windows x86

async_pyserial-0.2.1-cp38-cp38-musllinux_1_2_x86_64.whl (2.3 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

async_pyserial-0.2.1-cp38-cp38-musllinux_1_2_i686.whl (2.4 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

async_pyserial-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

async_pyserial-0.2.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

async_pyserial-0.2.1-cp38-cp38-macosx_11_0_arm64.whl (104.9 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page