Python CAN Library Overview
The can library in Python facilitates Controller Arrea Network (CAN) communication, a protocol widely used in automotive and industrial systems. It offers a uniform API for developing CAN-related applications without requiring a central host.
Basic Usage
Installation
Install the library using pip:
pip install python-can
Establishing Connection
Create a bus instance representing the CAN interface. Configuration depends on the operating system and hardware:
import can
bus = can.Bus(interface='socketcan', channel='vcan0')
Sending Messages
Construct and transmit messages using the Message class:
msg = can.Message(
arbitration_id=0x1A2,
data=bytes([0x10, 0x20, 0x30]),
is_extended_id=False
)
bus.send(msg)
Receiving Messages
Receive messages synchronously with blocking or timeout:
message = bus.recv(timeout=5.0)
if message:
print(f"ID: {message.arbitration_id}, Data: {message.data.hex()}")
Error Handling
Catch CAN-specific exceptinos:
try:
bus.send(msg)
except can.CanError as error:
print(f"Transmission failed: {error}")
Resource Management
Release resources after use:
bus.shutdown()
Advanced Functionality
Message Filtering
Configure filters during bus initialization to restrict incoming messages:
filters = [
{"can_id": 0x123, "can_mask": 0x7FF, "extended": False}
]
bus = can.Bus(interface='socketcan', channel='vcan0', filters=filters)
Asynchronous Handling
Callback Listeners
Implement message handlers using listeners:
def log_message(msg):
print(f"Received: ID={msg.arbitration_id}, Data={msg.data}")
listener = can.Listener()
listener.on_message_received = log_message
can.Notifier(bus, [listener])
Threaded Processing
Process messages in background threads:
from threading import Thread
import queue
msg_queue = queue.Queue()
def worker():
while True:
msg = msg_queue.get()
if msg is None: break
print(f"Processed: ID={msg.arbitration_id}")
Thread(target=worker, daemon=True).start()
notifier = can.Notifier(bus, [msg_queue])