Introduction to PySerial
PySerial is a powerful Python library designed to facilitate serial communication with devices via the RS-232 interface or other serial port protocols. It supports both synchronous and asynchronous modes, making it the go-to solution for software developers working on embedded systems, IoT devices, and hardware debugging.
Why Use PySerial?
With PySerial, developers can seamlessly integrate serial communication into their Python applications. It supports various platforms like Windows, macOS, and Linux, making it a versatile choice for cross-platform development. In addition, PySerial’s intuitive API provides developers with the flexibility to configure ports, transmit and receive data, and even handle multiple connections simultaneously.
How to Install PySerial
Installing PySerial is straightforward and can be done using pip:
pip install pyserial
Getting Started with PySerial
1. Opening a Serial Connection
Before communicating with a device, you must establish a connection to the serial port. Here’s an example:
import serial # Open a serial connection ser = serial.Serial('COM3', baudrate=9600, timeout=1) print("Serial Port:", ser.name)
2. Writing Data to the Serial Port
To send data through the serial port, you can use the write() method:
ser.write(b'Hello Device!\n')
3. Reading Data from the Serial Port
Use the read() or readline() method to fetch data:
data = ser.readline() print("Received:", data.decode('utf-8'))
4. Configuring Serial Port Parameters
You can configure parameters such as baud rate, parity, and stop bits:
ser.baudrate = 115200 ser.parity = serial.PARITY_ODD ser.stopbits = serial.STOPBITS_TWO
5. Handling Exception Scenarios
Always handle errors during communication:
try: ser = serial.Serial('COM3', baudrate=9600, timeout=1) except serial.SerialException as e: print(f"Error: {e}")
Advanced APIs in PySerial
6. Flushing Serial Buffers
Clear the input or output buffer:
ser.flushInput() ser.flushOutput()
7. Checking Port Availability
PySerial provides utility to list available ports:
from serial.tools import list_ports ports = list_ports.comports() for port in ports: print(port.device)
8. Event-Driven Serial Communication
Create asynchronously running listeners using threads:
import serial import threading def read_from_port(): while True: data = ser.readline() if data: print(data.decode('utf-8')) ser = serial.Serial('COM3', baudrate=9600, timeout=1) thread = threading.Thread(target=read_from_port) thread.start()
9. Closing Serial Connections
Always close the port after completing the communication:
ser.close()
Building a Practical PySerial Application
Below is a complete example of a PySerial-based application that sends and receives data through the serial port:
import serial import threading def read_from_port(serial_instance): while True: data = serial_instance.readline() if data: print("Received:", data.decode('utf-8')) def main(): try: ser = serial.Serial('COM3', baudrate=9600, timeout=1) print(f"Connected to {ser.name}") thread = threading.Thread(target=read_from_port, args=(ser,)) thread.daemon = True thread.start() while True: user_input = input("Enter message to send: ") ser.write(user_input.encode('utf-8')) except serial.SerialException as e: print(f"Connection Error: {e}") finally: ser.close() if __name__ == "__main__": main()
Conclusion
PySerial simplifies the implementation of serial communication in Python, providing robust features and customizable configurations. Whether you’re working on a personal project or a large-scale application involving hardware communication, mastering PySerial will make your development process smooth and efficient.