news 2026/5/1 9:57:00

【Python】python-can使用记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python】python-can使用记录

python-can是目前 Python 生态中最成熟、通用的CAN 总线通信库,支持多种硬件接口(PCAN、Vector、Kvaser、SocketCAN、slcan、USB2CAN 等),同时也支持虚拟 CAN(vcan)和 PCAN 等。

下面整理一份实用的python-can 使用记录(基于 2025–2026 年最新版本 4.6.x 系列),包含安装、基本用法、常见场景、注意事项等。

1. 安装

# 基本安装(推荐)pipinstallpython-can# 如果需要 serial 接口(如 slcan、arduino-can)pipinstallpython-can[serial]# 某些特定接口可能还需要额外驱动(如 PCAN 需要安装 Peak 驱动)

当前最新稳定版(2025年8月后):4.6.1
官方文档:https://python-can.readthedocs.io/en/stable/

2. 快速入门 - 创建 Bus 并收发消息

最经典的用法(以 SocketCAN 为例,Linux 常用):

importcanimporttime# 方式一:使用 with 语句(推荐,自动关闭)withcan.Bus(interface='socketcan',channel='vcan0',receive_own_messages=True)asbus:# 发送一条标准 CAN 消息 (ID=0x123, 数据 8 字节)msg=can.Message(arbitration_id=0x123,is_extended_id=False,# False=标准帧, True=扩展帧data=[0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88],is_fd=False,# 是否 CAN-FD(默认 False)bitrate_switch=False# FD 模式下是否切换速率)try:bus.send(msg,timeout=0.2)print("Message sent on",bus.channel_info)exceptcan.CanError:print("Message NOT sent")# 接收消息(阻塞式)print("Waiting for messages...")formsginbus:print(f"Received:{msg}")# msg.arbitration_id, msg.data, msg.timestamp, msg.dlc 等ifmsg.arbitration_id==0x321:print("Target message found!")break

带超时接收单条消息(更常用):

msg=bus.recv(timeout=3.0)# 等待最多 3 秒ifmsgisnotNone:print(f"Got: ID=0x{msg.arbitration_id:x}Data={msg.data.hex()}")else:print("Timeout - no message received")

3. 常用接口类型(interface 参数)

接口名称interface= 值平台备注
SocketCAN‘socketcan’Linux最常用,虚拟 vcan0 / 真实 can0/can1
PCAN‘pcan’Windows/Linux需要 Peak 驱动
Vector‘vector’Windows需要 Vector XL Driver
Kvaser‘kvaser’Windows/Linux需要 Kvaser 驱动
slcan‘slcan’跨平台USB转CAN(如 Lawicel、Arduino CAN)
virtual‘virtual’跨平台纯内存虚拟总线,用于测试
cantact‘cantact’跨平台CANtact 设备

创建 bus 几种等价写法

# 最常用(自动从配置读取)bus=can.Bus()# 需要提前配置 ~/.can 或环境变量# 显式指定(推荐生产环境)bus=can.Bus(interface='socketcan',channel='can0',bitrate=500000)# CAN-FD 示例bus=can.Bus(interface='pcan',channel='PCAN_USBD',fd=True,f_clock=80000000,dbitrate=2000000,bitrate=500000)

4. 过滤器设置(提高接收效率)

# 只接收特定 ID 的消息filters=[{"can_id":0x7E0,"can_mask":0x7FF,"extended":False},# 精确匹配 0x7E0{"can_id":0x18F,"can_mask":0x1FF0000,"extended":True}# 匹配 J1939 PGN]bus.set_filters(filters)

5. 周期发送(最常见需求)

defsend_periodic():bus=can.Bus('socketcan',channel='vcan0')msg=can.Message(arbitration_id=0x100,data=[0x01,0x02],is_extended_id=False)# 每 200ms 发送一次,持续运行task=bus.send_periodic(msg,period=0.2)try:time.sleep(10)# 运行 10 秒finally:task.stop()# 或者使用线程方式fromcan.threadimportThreadSafeBus

6. 配合 DBC 文件解析(强烈推荐)

importcanfromcantoolsimportdb db=db.load_file('your_database.dbc')withcan.Bus()asbus:formsginbus:decoded=db.decode_message(msg.arbitration_id,msg.data)print(decoded)

(需要额外安装:pip install cantools

7. 常用实用代码片段

打印所有收到的消息(带时间戳)

formsginbus:print(f"{msg.timestamp:>16.3f}{msg.arbitration_id:03X}{'X'ifmsg.is_extended_idelse' '}{msg.data.hex(' ')}")

发送 CAN-FD 消息

msg=can.Message(arbitration_id=0x123,data=[iforiinrange(64)],# CAN-FD 支持最长 64 字节is_fd=True,bitrate_switch=True)bus.send(msg)

8. 注意事项 & 常见问题

  • bitrate参数只在初始化时有效,后续不可改(除非重开 bus)
  • receive_own_messages=True时自己发的消息也会被收到(Linux SocketCAN 默认行为)
  • Windows 下 PCAN/Vector 需要安装官方驱动
  • Linux 下 SocketCAN 需要先配置 can 接口:sudo ip link set can0 up type can bitrate 500000
  • 虚拟测试:sudo modprobe vcan; sudo ip link add dev vcan0 type vcan; sudo ip link set vcan0 up
  • 异常处理:几乎所有操作都要try ... except can.CanError
  • 性能:大量消息时推荐使用can.Notifier+ 回调函数异步处理

9. 推荐学习路径

  1. 先跑通虚拟 CAN(vcan0)环境
  2. 掌握发送单条 / 周期发送 / 接收循环
  3. 学会设置过滤器
  4. 结合cantools + DBC做信号解析
  5. 最后对接真实硬件(PCAN / Vector / SocketCAN)

需要我针对某个具体硬件(PCAN、USBCAN、Vector、CANalyzer 配合等)给出详细示例,或者帮你写某个特定功能的完整脚本吗?直接告诉我需求~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:19:41

毕业设计 基于单片机的红外热视仪(源码+硬件+论文)

文章目录 0 前言1 主要功能2 硬件设计3 核心软件设计4 实现效果5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己…

作者头像 李华
网站建设 2026/4/8 17:03:37

计算机毕业设计springboot火车订票管理系统 基于Spring Boot的铁路票务信息管理平台 Spring Boot框架下的高铁出行服务系统

计算机毕业设计springboot火车订票管理系统1xam1 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着我国高速铁路网络的快速扩张和旅客出行需求的持续增长,传统的…

作者头像 李华
网站建设 2026/4/30 15:10:23

速览低查重AI教材编写技巧!用AI工具轻松产出专业适用的教材

整理教材的知识点真是件“细致活”,最难的地方在于如何平衡和衔接!我们总是担心会漏掉重要的知识点,或者很难掌控适合学生的难易程度——小学教材语言深奥,学生理解不了;而高中教材又显得过于简单,缺乏实用…

作者头像 李华
网站建设 2026/5/1 7:37:16

blender 导入fbx 黑色骨骼

二、最常见几种“灰色 vs 黑色”的含义 1️⃣ 法线方向(⭐⭐⭐⭐⭐ 最常见) 🔹 灰色 面法线朝外 光照正常 UE 导入后一般没问题 🔹 黑色 面法线翻转(朝里) 或你正在看 背面(Backface&…

作者头像 李华
网站建设 2026/5/1 6:17:13

【小程序毕设源码分享】基于springboot+android的健身房管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华