python-can

The python-can library provides Controller Area Network support for Python, providing common abstractions to different hardware devices, and a suite of utilities for sending and receiving messages on a CAN bus.

python-can runs any where Python runs; from high powered computers with commercial CAN to usb devices right down to low powered devices running linux such as a BeagleBone or RaspberryPi.

More concretely, some example uses of the library:

  • Passively logging what occurs on a CAN bus. For example monitoring a commercial vehicle using its OBD-II port.

  • Testing of hardware that interacts via CAN. Modules found in modern cars, motocycles, boats, and even wheelchairs have had components tested from Python using this library.

  • Prototyping new hardware modules or software algorithms in-the-loop. Easily interact with an existing bus.

  • Creating virtual modules to prototype CAN bus communication.

Brief example of the library in action: connecting to a CAN bus, creating and sending a message:

 1#!/usr/bin/env python
 2# coding: utf-8
 3
 4"""
 5This example shows how sending a single message works.
 6"""
 7
 8from __future__ import print_function
 9
10import can
11
12def send_one():
13
14    # this uses the default configuration (for example from the config file)
15    # see https://python-can.readthedocs.io/en/stable/configuration.html
16    bus = can.interface.Bus()
17
18    # Using specific buses works similar:
19    # bus = can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)
20    # bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
21    # bus = can.interface.Bus(bustype='ixxat', channel=0, bitrate=250000)
22    # bus = can.interface.Bus(bustype='vector', app_name='CANalyzer', channel=0, bitrate=250000)
23    # ...
24
25    msg = can.Message(arbitration_id=0xc0ffee,
26                      data=[0, 25, 0, 1, 3, 1, 4, 1],
27                      is_extended_id=True)
28
29    try:
30        bus.send(msg)
31        print("Message sent on {}".format(bus.channel_info))
32    except can.CanError:
33        print("Message NOT sent")
34
35if __name__ == '__main__':
36    send_one()

Contents:

Known Bugs

See the project bug tracker on github. Patches and pull requests very welcome!

Documentation generated

Jan 10, 2022