当前位置: 首页 > news >正文

【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 配合等)给出详细示例,或者帮你写某个特定功能的完整脚本吗?直接告诉我需求~

http://www.jsqmd.com/news/358516/

相关文章:

  • P9132 [USACO23FEB] Watching Cowflix P 题解
  • URL.createObjectURL 和 reader.readAsDataURL 对比,适用场景和最佳实践?
  • 毕业设计 基于单片机的红外热视仪(源码+硬件+论文)
  • C语言对话-31.与大虾对话 领悟设计模式
  • 别墅入户门一线品牌有哪些?2026九大领军者技术实力全面解析 - 匠言榜单
  • 2026 AI写论文软件大比拼:学生党适配指南
  • 亲测好用!一键生成论文工具 千笔·专业学术智能体 VS 文途AI 专科生专属
  • 探讨靠谱的生育津贴咨询应用品牌怎么选 - mypinpai
  • 从零开始写算法——贪心篇2:买卖股票的最佳时间 + 划分字母区间
  • 2026年倍克朗性价比排名,可靠的泳池漆厂家哪家好 - 工业推荐榜
  • 搞自动化的人应该都玩过电梯模型吧?今天咱们来唠唠用西门子S7-200 PLC和组态王搞五层电梯控制那点事儿。这玩意儿说难不难,但要让电梯跑得顺溜还得费点心思
  • 倍克朗专业不专业 泳池漆排名 价格合理的推荐 - myqiye
  • 屠榜级身材引爆大银幕!阿如那新戏拳击造型惊呆网友:反正很曼妙
  • HTTP 401 - {“code“:“InvalidApiKey“,“message“:“Invalid API-key provided.“,“request_id“:“d2725b0b-cb8
  • FileReader 四种主要读取方法对比
  • 江西医养结合养老院怎么选,有这些联系电话不怕找不到合适的 - mypinpai
  • 2026年精密轧机推荐厂商排行榜,实力大揭秘 - 工业品牌热点
  • 探讨深圳高新邦科技有限公司,为你揭秘其服务特色及价格 - 工业品牌热点
  • 拯救油塌发根!2026年值得入手的6款高泡控油洗发水,洗完蓬松感十足 - 华Sir1
  • 完整教程:双引擎时代:GEO与SEO如何协同重塑品牌增长路径
  • 2026年广州可靠的CE认证机构排名,高性价比CE认证授权机构分享 - 工业品网
  • 2026年南昌热门的豆包推广公司推荐,哪家口碑好且费用合理? - myqiye
  • 算法练习刷题题单 | 数学(163题)
  • 工厂设备图片素材推荐:捕捉科技感与细节瞬间 - 详解
  • 梳理值得选的滚珠丝杠生产厂,山东品牌性价比排行 - 工业设备
  • PPML 估计 + 一般均衡求解?ge_gravity2 一套 Stata 命令全搞定
  • 2026GEO行业权威推荐:圆周率——技术自研驱动的行业领航者 - 提酒换清欢
  • 2026年靠谱的导轨油服务品牌推荐,鑫瑞泽润滑油信誉有保障 - 工业品网
  • 2026年广州在职考研机构推荐,聊聊在职考研有名学校与规划 - 工业推荐榜
  • redis、mongodb、memcached 三个缓存数据库异同比较表