Skip to content

PySerial Module in Python: A Comprehensive Guide

PySerial is a Python library that encapsulates access to serial ports, providing easy-to-use APIs to communicate with serial devices. This guide will cover the key features, functionalities, and provide detailed examples to help you get started with PySerial.

Introduction to PySerial

PySerial is designed to facilitate communication with serial devices from Python applications. It supports various serial port implementations and provides a consistent API for managing serial ports and performing read/write operations.

Key features of PySerial: - Support for multiple platforms (Windows, Linux, macOS) - Easy-to-use API for serial communication - Configuration options for baud rate, parity, stop bits, and more - Timeout handling - Binary data support

Installation

To install PySerial, you can use pip:

pip install pyserial

Opening and Configuring Serial Ports

To open and configure a serial port, you need the port name and configuration parameters such as baud rate.

import serial

# Open a serial port
ser = serial.Serial(
    port='/dev/ttyUSB0',  # Replace with your serial port
    baudrate=9600,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    timeout=1
)

# Close the serial port
ser.close()

Reading from and Writing to Serial Ports

Reading from and writing to serial ports are fundamental operations in PySerial.

Writing Data

To write data to a serial port:

# Open a serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# Write data to the serial port
ser.write(b'Hello, World!')

# Close the serial port
ser.close()

Reading Data

To read data from a serial port:

# Open a serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# Read data from the serial port
data = ser.read(10)  # Read up to 10 bytes
print(data)

# Close the serial port
ser.close()

Serial Port Settings

PySerial allows you to configure various serial port settings.

Baud Rate

Set the baud rate for communication:

ser.baudrate = 115200

Data Bits

Set the number of data bits:

ser.bytesize = serial.SEVENBITS

Parity

Set the parity checking:

ser.parity = serial.PARITY_EVEN

Stop Bits

Set the number of stop bits:

ser.stopbits = serial.STOPBITS_TWO

Flow Control

Enable hardware (RTS/CTS) or software (XON/XOFF) flow control:

ser.rtscts = True  # Enable RTS/CTS flow control
ser.xonxoff = True  # Enable XON/XOFF flow control

Handling Timeouts

PySerial provides mechanisms to handle read and write timeouts.

Read Timeout

Set a timeout for read operations:

ser.timeout = 2  # Timeout in seconds

Write Timeout

Set a timeout for write operations:

ser.write_timeout = 2  # Timeout in seconds

No Timeout

Disable timeouts:

ser.timeout = None  # No timeout

Working with Binary Data

PySerial supports reading and writing binary data.

Writing Binary Data

# Open a serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# Write binary data to the serial port
ser.write(b'\x01\x02\x03\x04')

# Close the serial port
ser.close()

Reading Binary Data

# Open a serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# Read binary data from the serial port
data = ser.read(4)  # Read 4 bytes
print(data)

# Close the serial port
ser.close()

Advanced Features

Serial Port Enumeration

List available serial ports:

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()
for port in ports:
    print(port.device)

Using Context Managers

Use context managers to automatically handle resource cleanup:

with serial.Serial('/dev/ttyUSB0', 9600, timeout=1) as ser:
    ser.write(b'Hello, World!')
    data = ser.read(10)
    print(data)

Serial Communication with Threads

Use threads for non-blocking serial communication:

import threading

def read_from_port(ser):
    while True:
        data = ser.read(10)
        if data:
            print(data)

# Open a serial port
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# Start a thread for reading from the serial port
thread = threading.Thread(target=read_from_port, args=(ser,))
thread.start()

# Write data to the serial port
ser.write(b'Hello, World!')

# Close the serial port
ser.close()

Error Handling

Handle errors gracefully in PySerial:

try:
    # Open a serial port
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

    # Write data to the serial port
    ser.write(b'Hello, World!')

    # Close the serial port
    ser.close()
except serial.SerialException as e:
    print(f"Serial error: {e}")
except serial.SerialTimeoutException as e:
    print(f"Timeout error: {e}")

Conclusion

PySerial is a powerful and versatile library for serial communication in Python. Its extensive feature set and easy-to-use API make it suitable for a wide range of applications, from simple data logging to complex device communication. By mastering the core features and functionalities of PySerial, you can efficiently manage serial ports and perform reliable serial communication. This guide should serve as a solid foundation for building serial-based applications using PySerial.