news 2026/9/13 5:20:45

【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/9/12 11:22:50

从S锁/X锁到Next-Key Lock:MySQL锁机制硬核拆解

从 S 锁 / X 锁 到 Next-Key Lock:MySQL InnoDB 锁机制硬核拆解 MySQL 的 InnoDB 引擎锁机制是面试和生产中高频考点,尤其是幻读如何被解决、Next-Key Lock 到底锁了什么、加锁规则如何判断等。下面从基础到进阶,一层层拆解。 1. 锁的分类总…

作者头像 李华
网站建设 2026/8/29 8:12:58

PPML 估计 + 一般均衡求解?ge_gravity2 一套 Stata 命令全搞定

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。 丁闪闪 (lianxhcn163.com) 曾咏新 厦门大学 (zengyongxinhpe163.com) 提要:本文系统整理了金融大语言模型 (LLM) 研究的核心资源,包括 12 个主流金融数…

作者头像 李华
网站建设 2026/9/12 4:38:25

leetcode 930. Binary Subarrays With Sum 和相同的二元子数组

Problem: 930. Binary Subarrays With Sum 和相同的二元子数组 前缀和,哈希表记录每个和所在的索引i,对goal0分开讨论的,使用前缀和- goal,拿到s prefixSum[i1] - goal;,数可能的子数组个数,并累加 Code …

作者头像 李华
网站建设 2026/8/27 15:55:14

探秘AI教材写作!这些工具能让你的教材生成过程低查重率

在编写教材的过程中,总是能精准触及“慢节奏”带来的种种问题。尽管已经准备好了框架和资料,却总是在内容写作上卡住——一段话反复推敲半个小时,还是觉得表达不够准确;章节间的过渡连接,更是绞尽脑汁也想不出合适的词…

作者头像 李华
网站建设 2026/9/9 0:23:54

四光吊舱多光谱融合技术解析

四光吊舱的多光谱融合,核心在于将可见光、热成像等不同波段的传感器数据进行协同处理和智能分析。这不仅能让你“看见”,更能让你“看透”复杂场景。多光谱融合模块的技术要点这项技术主要围绕硬件集成、算法处理和环境适应三个层面展开,下表…

作者头像 李华
网站建设 2026/9/7 23:09:57

AI写教材就选它!专业工具打造低查重优质教材,提升效率!

许多教材编写者常常感到遗憾:尽管他们精心撰写了教材的正文,但却因为缺少配套资源,导致整体的教学效果大打折扣。课后练习的题型设计需要有层次感,然而常常缺乏新颖的创意;想要制作直观的教学课件,却又没有…

作者头像 李华