# 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
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36

    #!/usr/bin/env python
    # coding: utf-8

    """
    This example shows how sending a single message works.
    """

    from __future__ import print_function

    import can

    def send_one():

        # this uses the default configuration (for example from the config file)
        # see https://python-can.readthedocs.io/en/stable/configuration.html
        bus = can.interface.Bus()

        # Using specific buses works similar:
        # bus = can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=250000)
        # bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
        # bus = can.interface.Bus(bustype='ixxat', channel=0, bitrate=250000)
        # bus = can.interface.Bus(bustype='vector', app_name='CANalyzer', channel=0, bitrate=250000)
        # ...

        msg = can.Message(arbitration_id=0xc0ffee,
                          data=[0, 25, 0, 1, 3, 1, 4, 1],
                          is_extended_id=True)

        try:
            bus.send(msg)
            print("Message sent on {}".format(bus.channel_info))
        except can.CanError:
            print("Message NOT sent")

    if __name__ == '__main__':
        send_one()

Contents:

- Installation
  - GNU/Linux dependencies
  - Windows dependencies
  - Installing python-can in development mode
- Configuration
  - In Code
  - Configuration File
  - Environment Variables
  - Interface Names
- Library API
  - Bus
  - Thread safe bus
  - Message
  - Listeners
  - Asyncio support
  - Broadcast Manager
  - Internal API
  - Utilities
  - Notifier
  - Errors
- CAN Interface Modules
  - SocketCAN
  - Kvaser’s CANLIB
  - CAN over Serial
  - CAN over Serial / SLCAN
  - IXXAT Virtual CAN Interface
  - PCAN Basic API
  - USB2CAN Interface
  - NI-CAN
  - isCAN
  - NEOVI Interface
  - Vector
  - Virtual
  - CANalyst-II
  - SYSTEC interface
- Scripts
  - can.logger
  - can.player
  - can.viewer
- Developer’s Overview
  - Contributing
  - Building & Installing
  - Creating a new interface/backend
  - Code Structure
  - Process for creating a new Release
- History and Roadmap
  - Background
  - Acknowledgements
  - Support for CAN within Python

## Known Bugs

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

Documentation generated

Jan 13, 2020