概述
本文记录了 python-can 在汽车领域 CAN 模块自动化测试中的应用,涵盖上位机开发及总线桥接方案。该库基于 python-can 进行开发,支持 Trace、Graph、Log、UDS、刷写等功能。
1 安装
设备的 CAN 驱动需自行手动安装。 使用 pip 安装 python-can:
pip install python-can
可查阅官方手册了解详细功能讲解及支持的硬件设备。
2 功能说明
2.1 bus 的实例化(创建)
2.1.1 Bus 类
can.interface.Bus 是用于创建 bus 实体控制总线行为的关键类。通俗地讲就是打开硬件设备,在此基础去控制报文收发。 以下是一个打开 pcan 设备通道 PCAN_USBBUS1 的例子:
import can
bus = can.interface.Bus(interface='pcan', channel='PCAN_USBBUS1', bitrate=500000)
- interface:指的是硬件设备,参考 BACKENDS。
- channel:指的是通道。不同设备可能定义方式不同,pcan 使用字符串'PCAN_USBBUS1',vector 可直接使用数字 0123,具体需要参考设备对应定义的类。
2.1.2 ThreadSafeBus 类
can.ThreadSafeBus 是在 Bus 类的基础上封装,可安全的用于多线程访问,比如多个定时器同时发送报文。使用方式和 Bus 类一样:
import can
bus = can.ThreadSafeBus(interface='pcan', channel='PCAN_USBBUS1', bitrate=500000)
2.1.3 支持的硬件设备
可通过查看源码中的 BACKENDS 定义了解支持的设备类型。大部分常用接口包括 kvaser, socketcan, serial, pcan, usb2can, ixxat, nican, iscan, virtual, udp_multicast, neovi, vector, slcan, robotell, canalystii, systec, seeedstudio, cantact, gs_usb, nixnet, neousys, etas, socketcand, zlg 等。 Bus 类本质上是对这些类的封装,通过'interface'参数进行识别。也可直接调用设备定义的类,比如 pcan:
import can.interfaces.pcan as pcan
bus = pcan.PcanBus(channel='PCAN_USBBUS1', bitrate=500000)
每个设备定义的类都是基于抽象基类 BusABC,实现报文的收发、波特率设置等通用的功能。
2.2 关闭 bus
bus 在使用完后,要调用 bus.shutdown 方法将设备关闭,否则会影响再次开启。
2.3 收发报文
2.3.1 发送报文
bus 实例化以后,直接调用 send() 方法,传入 message 参数即可发送报文。
bus.send(can.Message(arbitration_id=0x123, data=[0,,,,,,,]))

