`python-can`(常简称为 `pycan`)是一个用于与 CAN(Controller Area Network)总线进行交互的 Python 库

发布时间:2026/7/24 21:36:35
`python-can`(常简称为 `pycan`)是一个用于与 CAN(Controller Area Network)总线进行交互的 Python 库 python-can常简称为pycan是一个用于与 CANController Area Network总线进行交互的 Python 库它提供跨平台、标准化的 API支持多种硬件接口如 SocketCAN、PCAN、USBtin、Kvaser、Vector、Ixxat 等广泛应用于汽车电子、工业控制和嵌入式系统开发中。核心特性✅ 统一的Bus抽象层屏蔽底层硬件差异✅ 支持经典 CAN 和 CAN FD需硬件与驱动支持✅ 提供Message类封装帧结构ID、DLC、data、is_extended_id、is_fd、is_remote_frame 等✅ 内置过滤器CanFilter、错误处理、超时机制✅ 支持实时收发、日志记录ASC、BLF、CSV 格式、回放功能✅ 兼容 asyncioAsyncBus和多线程场景基础使用示例SocketCAN on Linuximportcan# 初始化 CAN 总线以 Linux SocketCAN 为例buscan.Bus(interfacesocketcan,channelvcan0,bitrate500000)# 发送一条标准帧msgcan.Message(arbitration_id0x123,data[0x01,0x02,0x03],is_extended_idFalse)bus.send(msg)print(Message sent!)# 接收一条消息阻塞received_msgbus.recv(timeout1.0)ifreceived_msg:print(fReceived: ID0x{received_msg.arbitration_id:X}, Data{received_msg.data.hex()})bus.shutdown()安装方式pipinstallpython-can# 若需特定接口支持如 PCAN额外安装驱动或依赖# pip install python-can[pcan] # Windows PCAN-USB# pip install python-can[kvaser] # Kvaser 接口⚠️ 注意事项Linux 下需提前配置虚拟/物理 CAN 接口如sudo modprobe vcan sudo ip link add dev vcan0 type vcanWindows 用户需安装对应硬件厂商驱动如 PEAK-System、Kvaser、Vectorpython-can本身不实现物理层仅作为上层协议栈桥梁在 Windows 上使用python-can驱动PEAK-System PCAN-USB设备需完成以下硬件驱动安装、Python 环境配置和代码适配三步。整个过程依赖 PEAK 官方提供的底层 DLLPCANBasic.dllpython-can通过其 Python 封装pcan接口与之通信。✅ 一、前置条件与准备工作项目要求硬件PCAN-USB或 PCAN-USB FD、PCAN-USB Pro 等兼容型号操作系统Windows 10/1164位推荐32位需匹配 DLL 架构管理员权限安装驱动和运行程序时建议以管理员身份操作✅ 二、安装 PEAK 官方驱动关键步骤下载驱动包访问 PEAK-System 官网下载页面 → 找到“PCAN-Basic”非 PCAN-Developer→ 下载最新版PCANBasic_Setup.exe如PCANBasic_4.7.0.exe。安装驱动以管理员身份运行安装程序勾选“Install PCAN-Basic API”和“Install USB driver”自动安装 WinUSB 或 NDIS 驱动安装完成后设备管理器中应显示PEAK-System PCAN-USB状态为“正常工作” 若出现黄色感叹号请右键 → “更新驱动程序” → “浏览我的计算机” → 选择C:\Windows\System32\drivers\pcanusb.sys或重新运行安装程序修复。验证 DLL 存在确保以下文件存在路径可能因版本略有差异C:\Windows\System32\PCANBasic.dll64位系统C:\Windows\SysWOW64\PCANBasic.dll32位 Python 需此路径⚠️python-can会自动查找该 DLL若报错OSError: cannot load library请确认 DLL 架构x64/x86与 Python 解释器一致。✅ 三、Python 环境配置# 推荐使用虚拟环境python-mvenv can_env can_env\Scripts\activate# 安装 python-can 及 PCAN 支持自动安装 pcan 包pipinstallpython-can[pcan]# 验证安装python-cimport can; print(can.__version__)✅ 注意[pcan]是可选依赖它会额外安装pcanPEAK 官方 Python 封装但python-can本身也内置了对PCANBasic.dll的直接调用逻辑二者兼容。✅ 四、Python 代码示例即插即用importcan# 初始化 PCAN-USB通道对应设备管理器中的 CAN 接口号如 PCAN_USBBUS1buscan.Bus(interfacepcan,channelPCAN_USBBUS1,# 常见值PCAN_USBBUS1 ~ PCAN_USBBUS16bitrate500000,statecan.BusState.ACTIVE# 或 can.BusState.PASSIVE只监听)try:# 发送测试帧msgcan.Message(arbitration_id0x123,data[0xDE,0xAD,0xBE,0xEF],is_extended_idFalse)bus.send(msg)print(Message sent on PCAN-USB.)# 接收一帧超时1秒recv_msgbus.recv(timeout1.0)ifrecv_msg:print(fReceived: ID0x{recv_msg.arbitration_id:X}, Data{recv_msg.data.hex()})else:print(No message received (timeout).)finally:bus.shutdown()常见 channel 名称参考设备管理器 → PEAK-System 设备属性 → 详细信息 → “设备实例路径”PCAN_USBBUS1默认第一个 USB 设备PCAN_USBBUS2第二个、PCAN_PCIBUS1PCI 卡等可通过can.interfaces.pcan.get_available_interfaces()列出所有可用通道需python-can4.3.0✅ 五、排错提示现象解决方案OSError: cannot load library PCANBasic.dll检查 DLL 是否存在 Python 位数32/64是否匹配 DLL 架构尝试将 DLL 复制到脚本同目录ValueError: Channel PCAN_USBBUS1 not found设备未识别 → 重装驱动或 channel 名错误 → 查设备管理器或用get_available_interfaces()发送成功但接收不到回环帧PCAN-USB 默认不支持自发自收loopback需外接终端电阻并连接真实节点或启用硬件 loopback部分型号支持PCAN_ERROR_BUSLIGHT / BUSHEAVY总线电平异常 → 检查终端电阻120Ω、线缆、波特率匹配、节点供电✅补充建议使用 PCAN-View 工具验证硬件通信正常后再切入 Python 开发如需高实时性避免bus.recv()阻塞改用can.Notifiercan.Listener异步处理