一、概述

1.介绍

python-can库为Python提供了控制器局域网的支持,为不同的硬件设备提供了通用的抽象,并提供了一套实用程序,用于在CAN总线上发送和接收消息。

支持硬件接口:

Name

Documentation

"socketcan"

SocketCAN

"kvaser"

Kvaser’s CANLIB

"serial"

CAN over Serial

"slcan"

CAN over Serial / SLCAN

"ixxat"

IXXAT Virtual CAN Interface

"pcan"

PCAN Basic API

"usb2can"

USB2CAN Interface

"nican"

NI-CAN

"iscan"

isCAN

"neovi"

neoVI

"vector"

Vector

"virtual"

Virtual

"canalystii"

CANalyst-II

"systec"

SYSTEC interface

2.环境搭建

Python安装:https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64.exe

PCAN-USB驱动:https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip

库:pip install python-can

3.参考文档

https://python-can.readthedocs.io/en/master/#

二、常用方法

1.接收报文

from can.interfaces.pcan.pcan import PcanBus

def bus_recv():
"""轮询接收消息"""
try:
while True:
msg = bus.recv(timeout=100)
print(msg)
except KeyboardInterrupt:
pass if __name__ == '__main__':
bus = PcanBus(channel='PCAN_USBBUS1', bitrate=500000)
bus_recv()

2.发送报文

from can.interfaces.pcan.pcan import PcanBus

def bus_send():
"""can消息发送"""
while True:
time.sleep(0.02)
try:
bus.send(msg)
print("消息发送 {}".format(bus.channel_info))
except can.CanError:
print("消息未发送") if __name__ == '__main__':
msg = can.Message(arbitration_id=0x181DFF00, data=[0xEE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE],
is_extended_id=True) # 报文
bus = PcanBus(channel='PCAN_USBBUS1', bitrate=500000)
bus_send()

3.定期发送报文

def bus_send_periodic():
"""周期发送报文"""
print("开始每200毫秒发送一条消息。持续时间10s")
task = bus.send_periodic(msg, 1.5) # 定期发送
if not isinstance(task, can.ModifiableCyclicTaskABC): # 断言task类型
print("此接口似乎不支持")
task.stop()
return
time.sleep(5) # 持续时间
print("发送完成")
print("更改运行任务的数据以99开头")
msg.data[0] = 0x99
task.modify_data(msg) # 修改data首字节
time.sleep(10) task.stop()
print("停止循环发送")
print("将停止任务的数据更改为单个 ff 字节")
msg.data = bytearray([0xff]) # 重新定向data
msg.dlc = 1 # 定义data长度
task.modify_data(msg) # 修改data
time.sleep(10)
print("重新开始")
task.start() # 重新启动已停止的周期性任务
time.sleep(10)
task.stop()
print("完毕") if __name__ == '__main__':
msg = can.Message(arbitration_id=0x181DFF00, data=[0xEE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE],
is_extended_id=True) # 报文
bus = PcanBus(channel='PCAN_USBBUS1', bitrate=500000)
bus_send_periodic()

4.循环收发消息

from can.interfaces.pcan.pcan import PcanBus

def send_cyclic(stop_event):
"""循环发送消息"""
print("开始每1秒发送1条消息")
start_time = time.time()
while not stop_event.is_set():
msg.timestamp = time.time() - start_time
bus.send(msg)
print(f"tx: {msg}")
time.sleep(1)
print("停止发送消息") def receive(stop_event):
"""循环接收消息"""
print("开始接收消息")
while not stop_event.is_set():
rx_msg = bus.recv(1)
if rx_msg is not None:
print(f"rx: {rx_msg}")
print("停止接收消息") def send_and_recv_msg():
"""发送一个消息并接收一个消息,需要双通道CAN"""
stop_event = threading.Event()
t_send_cyclic = threading.Thread(target=send_cyclic, args=(stop_event,))
t_receive = threading.Thread(target=receive, args=(stop_event,))
t_receive.start()
t_send_cyclic.start()
try:
while True:
time.sleep(0) # yield
except KeyboardInterrupt:
pass # 正常退出
stop_event.set()
time.sleep(0.5) if __name__ == '__main__':
msg = can.Message(arbitration_id=0x181DFF00, data=[0xEE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE],
is_extended_id=True) # 报文
bus = PcanBus(channel='PCAN_USBBUS1', bitrate=500000)
send_and_recv_msg()

python-can库基于PCAN-USB使用方法的更多相关文章

  1. python安装库报错的处理方法

    在安装python map库时遇到了还多问题,找了好的方法都没有安装成功,最后改安装basemap库参考了了:https://www.jb51.net/article/147780.htm一文操作,最 ...

  2. python第三方库的四种安装方法

    1,直接pip install安装 2,在python-->default setting-->project interprer-->add 3,在这个链接里找到需要的包,下载 h ...

  3. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  4. Python机器学习库scikit-learn实践

    原文:http://blog.csdn.net/zouxy09/article/details/48903179 一.概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得 ...

  5. Python常用库大全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  6. python的库小全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  7. python 三方库

    ---------------- 这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护.内容包括:Web框架.网络爬虫.网络内容提取.模板引擎.数据库.数据可视化.图片处理. ...

  8. Python常用库大全,看看有没有你需要的

    作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. Python第三方库资源

    [转载]Python第三方库资源   转自:https://weibo.com/ttarticle/p/show?id=2309404129469920071093 参考:https://github ...

  10. 【转载】Python第三方库资源

    转自:https://weibo.com/ttarticle/p/show?id=2309404129469920071093 参考:https://github.com/jobbole/awesom ...

随机推荐

  1. IBM MQ常用运维命令

    创建队列管理器 crtmqm –q QMgrName -q是指创建缺省的队列管理器 删除队列管理器 dltmqm QmgrName 启动队列管理器 strmqm QmgrName 如果是启动默认的队列 ...

  2. django之集成阿里云通信(发送手机短信验证码)

    python3 + django2.0 集成 "阿里云通信" 服务: (SDK文档地址:https://help.aliyun.com/document_detail/55491. ...

  3. Linux 集群 和免秘钥登录的方法。

    /* 1.1.什么是集群? 很多台服务器(计算机)做相同的事,就称之为集群 服务器和服务器之间必须要处于联通状态(linux01和linux02可以相互访问并且传输数据) 服务器的配置和常见的计算机没 ...

  4. C++学习Day 1

    c++的函数需要声明才能再写他的定义,声明可以写多次,如果执行在main之前可以不写,全写不会犯错,现在看好像c++的函数定义里没有out,也没有变量的public和private(后面有再改) 声明 ...

  5. HOW2J 全套教程整理:Java、前端、数据库、中间件、第三方、项目、面试题

    考虑到部分同学寝室会断网,原站的所有的免费内容都提供了一个离线版本以供使用.但是它直接提供了静态页面,并不方便在手机上阅读,因为我将其转换为 EPUB. 目录 HOW2J J2EE 教程.epub H ...

  6. 使用 TensorFlow 构建机器学习项目中文版·翻译完成

    原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原 ...

  7. 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...

  8. JAVA多线程学习十六 - 同步集合类的应用

    1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...

  9. Swift字符串的介绍

    字符串的介绍 字符串在任何的开发中使用都是非常频繁的 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"" ...

  10. linux 批量替换文件内容及查找某目录下所有包含某字符串的文件

    转载请注明来源:https://www.cnblogs.com/hookjc/ 1. sed C代码   grep -rl matchstring somedir/ | xargs sed -i 's ...