【Python】python-can使用记录 📅 发布时间:2026/7/12 0:20:33 👁️ 浏览次数: python-can是目前 Python 生态中最成熟、通用的CAN 总线通信库支持多种硬件接口PCAN、Vector、Kvaser、SocketCAN、slcan、USB2CAN 等同时也支持虚拟 CANvcan和 PCAN 等。下面整理一份实用的python-can 使用记录基于 2025–2026 年最新版本 4.6.x 系列包含安装、基本用法、常见场景、注意事项等。1. 安装# 基本安装推荐pipinstallpython-can# 如果需要 serial 接口如 slcan、arduino-canpipinstallpython-can[serial]# 某些特定接口可能还需要额外驱动如 PCAN 需要安装 Peak 驱动当前最新稳定版2025年8月后4.6.1官方文档https://python-can.readthedocs.io/en/stable/2. 快速入门 - 创建 Bus 并收发消息最经典的用法以 SocketCAN 为例Linux 常用importcanimporttime# 方式一使用 with 语句推荐自动关闭withcan.Bus(interfacesocketcan,channelvcan0,receive_own_messagesTrue)asbus:# 发送一条标准 CAN 消息 (ID0x123, 数据 8 字节)msgcan.Message(arbitration_id0x123,is_extended_idFalse,# False标准帧, True扩展帧data[0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88],is_fdFalse,# 是否 CAN-FD默认 Falsebitrate_switchFalse# FD 模式下是否切换速率)try:bus.send(msg,timeout0.2)print(Message sent on,bus.channel_info)exceptcan.CanError:print(Message NOT sent)# 接收消息阻塞式print(Waiting for messages...)formsginbus:print(fReceived:{msg})# msg.arbitration_id, msg.data, msg.timestamp, msg.dlc 等ifmsg.arbitration_id0x321:print(Target message found!)break带超时接收单条消息更常用msgbus.recv(timeout3.0)# 等待最多 3 秒ifmsgisnotNone:print(fGot: ID0x{msg.arbitration_id:x}Data{msg.data.hex()})else:print(Timeout - no message received)3. 常用接口类型interface 参数接口名称interface 值平台备注SocketCAN‘socketcan’Linux最常用虚拟 vcan0 / 真实 can0/can1PCAN‘pcan’Windows/Linux需要 Peak 驱动Vector‘vector’Windows需要 Vector XL DriverKvaser‘kvaser’Windows/Linux需要 Kvaser 驱动slcan‘slcan’跨平台USB转CAN如 Lawicel、Arduino CANvirtual‘virtual’跨平台纯内存虚拟总线用于测试cantact‘cantact’跨平台CANtact 设备创建 bus 几种等价写法# 最常用自动从配置读取buscan.Bus()# 需要提前配置 ~/.can 或环境变量# 显式指定推荐生产环境buscan.Bus(interfacesocketcan,channelcan0,bitrate500000)# CAN-FD 示例buscan.Bus(interfacepcan,channelPCAN_USBD,fdTrue,f_clock80000000,dbitrate2000000,bitrate500000)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():buscan.Bus(socketcan,channelvcan0)msgcan.Message(arbitration_id0x100,data[0x01,0x02],is_extended_idFalse)# 每 200ms 发送一次持续运行taskbus.send_periodic(msg,period0.2)try:time.sleep(10)# 运行 10 秒finally:task.stop()# 或者使用线程方式fromcan.threadimportThreadSafeBus6. 配合 DBC 文件解析强烈推荐importcanfromcantoolsimportdb dbdb.load_file(your_database.dbc)withcan.Bus()asbus:formsginbus:decodeddb.decode_message(msg.arbitration_id,msg.data)print(decoded)需要额外安装pip install cantools7. 常用实用代码片段打印所有收到的消息带时间戳formsginbus:print(f{msg.timestamp:16.3f}{msg.arbitration_id:03X}{Xifmsg.is_extended_idelse }{msg.data.hex( )})发送 CAN-FD 消息msgcan.Message(arbitration_id0x123,data[iforiinrange(64)],# CAN-FD 支持最长 64 字节is_fdTrue,bitrate_switchTrue)bus.send(msg)8. 注意事项 常见问题bitrate参数只在初始化时有效后续不可改除非重开 busreceive_own_messagesTrue时自己发的消息也会被收到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. 推荐学习路径先跑通虚拟 CANvcan0环境掌握发送单条 / 周期发送 / 接收循环学会设置过滤器结合cantools DBC做信号解析最后对接真实硬件PCAN / Vector / SocketCAN需要我针对某个具体硬件PCAN、USBCAN、Vector、CANalyzer 配合等给出详细示例或者帮你写某个特定功能的完整脚本吗直接告诉我需求
电影推荐系统 | Python Django 协同过滤 requests爬虫 bootstrap3 毕业设计源码 博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与… 2026/7/11 8:26:01
【小程序毕设源码分享】基于springboot+小程序的汽车服务企业客户评价APP的设计与实现(程序+文档+代码讲解+一条龙定制) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 14:20:05
【小程序毕设全套源码+文档】基于Android的个人财务管理软件的设计与实现(丰富项目+远程调试+讲解+定制) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/8 14:29:04
UML 2.5 状态图实战:3个典型场景建模与10个核心元素解析 UML 2.5 状态图实战:3个典型场景建模与10个核心元素解析在软件系统设计中,我们常常需要描述对象如何响应外部事件并改变其状态。想象一下电商平台的订单系统:从"待支付"到"已发货",再到"已完成"或&… 2026/7/12 0:19:18
UML 状态图 vs 活动图:5个维度对比与适用场景选择指南 UML 状态图 vs 活动图:5个维度对比与适用场景选择指南在系统设计与建模过程中,UML(统一建模语言)提供了多种图形工具来帮助开发者清晰地表达系统行为。其中,状态图和活动图作为两种重要的动态行为图,经常让… 2026/7/12 0:19:18
SAM-2.1 自定义分割微调实战:从自定义数据集到自动掩码生成 SAM-2.1 自定义分割微调实战:从自定义数据集到自动掩码生成 这篇教程是我根据 SAM-2.1 自定义数据集微调和自动 mask 生成流程整理出来的。重点演示如何下载 SAM2 格式数据集,配置 SAM-2.1 训练脚本,训练后对比微调模型和基础模型的分割效果。… 2026/7/12 0:15:17
创作革新:TEdit地图编辑器释放泰拉瑞亚世界的无限表达可能 创作革新:TEdit地图编辑器释放泰拉瑞亚世界的无限表达可能 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets yo… 2026/7/12 0:15:17
ChatGPT创意写作提示词终极矩阵(2024Q2更新):覆盖12大垂直领域、47种文体、9类受众心智模型的即插即用指令集 更多请点击: https://kaifayun.com 第一章:ChatGPT创意写作提示词的底层逻辑与范式演进 创意写作提示词并非简单指令堆砌,而是人机协同认知建模的语言接口。其底层逻辑根植于大语言模型的三重机制:上下文感知的注意力权重分配、… 2026/7/12 0:15:17
Scrapy 中使用的 `parsel` 是一个独立的、轻量级的 HTML/XML 解析库,专为高效提取网页数据而设计 Scrapy 中使用的 parsel 是一个独立的、轻量级的 HTML/XML 解析库,专为高效提取网页数据而设计。它被 Scrapy 内部用作默认的选择器引擎(替代了早期版本中基于 lxml 的直接封装),提供类似 jQuery 的 CSS 选择器和 XPath 表达式支持… 2026/7/12 0:13:17
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14