首页 > 编程语言 >CAN通讯-使用Python收发CAN数据保姆级教程(包含完整代码)

CAN通讯-使用Python收发CAN数据保姆级教程(包含完整代码)

时间:2023-08-22 14:24:33浏览次数:46  
标签:教程 Python frame canlib number 收发 print channel

CAN通讯-使用Python收发CAN数据

配置环境

使用环境:python3.6
平台:Windows10
IDE:PyCharm

1.环境配置

1.1安装CAN通讯需要的包

pip install canlib
1

1.2 安装kvaser_drivers以及Kvaser CanKing

这些软件可以在官网下载https://www.kvaser.com/download/

官网是英文的,看起来可能有点吃力,这里也给出云盘连接:
链接:https://pan.baidu.com/s/1LDKyIlOV0Ky4d2qxryLZGQ
提取码:vwiv

下载下来之后的文件是这样的,三个文件依次双击安装就行了

在这里插入图片描述
安装完后,在开始栏可以查看到已经安装好了
在这里插入图片描述

2.使用Python收发数据

2.1接发数据代码如下:

2.1.1接收数据代码

# author:Hurricane
# date:  2021/4/12
# File : CAN_receive.py
# E-mail:[email protected]
import sys

from canlib import canlib


def print_frame(frame):
    """Prints a message to screen"""
    if (frame.flags & canlib.canMSG_ERROR_FRAME != 0):
        print("***ERROR FRAME RECEIVED***")
    else:
        print("{id:0>8X}  {dlc}  {data}  {timestamp}".format(
            id=frame.id,
            dlc=frame.dlc,
            data=' '.join('%02x' % i for i in frame.data),
            timestamp=frame.timestamp
        ))


if __name__ == '__main__':
    # Initialization
    channel_number = 0

    # Specific CANlib channel number may be specified as first argument
    if len(sys.argv) == 2:
        channel_number = int(sys.argv[1])

    chdata = canlib.ChannelData(channel_number)
    print("%d. %s (%s / %s)" % (channel_number, chdata.channel_name,
                                chdata.card_upc_no,
                                chdata.card_serial_no))

    # Open CAN channel, virtual channels are considered ok to use
    ch = canlib.openChannel(channel_number, canlib.canOPEN_ACCEPT_VIRTUAL)

    print("Setting bitrate to 500 kb/s")
    ch.setBusParams(canlib.canBITRATE_500K)
    ch.busOn()

    # Start listening for messages
    finished = False
    print("   ID    DLC DATA                     Timestamp")
    while not finished:
        try:
            frame = ch.read(timeout=50)
            print_frame(frame)
        except(canlib.canNoMsg) as ex:
            pass
        except (canlib.canError) as ex:
            print(ex)
            finished = True

    # Channel teardown
    ch.busOff()
    ch.close()


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

2.1.2发送数据代码

# author:Hurricane
# date:  2021/4/12
# File : CAN_send.py
# E-mail:[email protected]

import sys

from canlib import canlib, Frame

channel_number = 1
# Specific CANlib channel number may be specified as first argument
if len(sys.argv) == 2:
    channel_number = int(sys.argv[1])

print("Opening channel %d" % (channel_number))

# Use ChannelData to get some information about the selected channel
chd = canlib.ChannelData(channel_number)
print("%d. %s (%s / %s) " % (channel_number,
                             chd.channel_name,
                             chd.card_upc_no,
                             chd.card_serial_no))

# If the channel have a custom name, print it
if chd.custom_name != '':
    print("Customized Channel Name: %s " % (chd.custom_name))

# Open CAN channel, virtual channels are considered ok to use
ch = canlib.openChannel(channel_number, canlib.canOPEN_ACCEPT_VIRTUAL)

print("Setting bitrate to 500 kb/s")
ch.setBusParams(canlib.canBITRATE_500K)

print("Going on bus")
ch.busOn()

print("Sending a message")
frame = Frame(id_=123,
              data=[1, 2, 3, 4, 5, 6, 7, 8],
              dlc=8,
              flags=0)
ch.write(frame)
print("Going off bus")
ch.busOff()

print("Closing channel")
ch.close()

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

注:发送数据代码是发送这样的一帧数据:
id是123,长度为8的CAN帧
PS:这里面的信息可以自行修改,符合CAN帧的规则就行

frame = Frame(id_=123,
              data=[1, 2, 3, 4, 5, 6, 7, 8],
              dlc=8,
              flags=0)
1234

2.2验证发送数据

验证是否发送成功,只需要看到有没有接收到数据就行了,本文通过Kvaser提供的软件来测试是否接收到数据。

当然也可以通过上文提到的接收数据的代码,这个在后文会提到。

2.2.1使用Kvaser Can King接收数据

打开CAnKing软件(此软件在1.2节已经提供安装包)

  • 设置CAN通道为0
  • 设置波特率为500K
  • 点击按钮Go On Bus
    在这里插入图片描述

现在CAN的0通道便打开了,在右侧Output框可以显示发送以及接收到的数据

2.2.2使用Python发送数据

运行2.1.2的Python文件
在这里插入图片描述
可以看到运行一次代码,Kvaser Can King便会接收一帧数据

2.3验证接收数据

2.3.1使用Kvaser Can King发送数据

与2.2.1同样打开CAnKing软件

  • 设置CAN通道为0
  • 设置波特率为500K
  • 点击按钮Go On Bus
    在这里插入图片描述

现在CAN的0通道便打开了,在右侧Output框可以显示发送以及接收到的数据
按照下图打开Universal按钮
在这里插入图片描述
点击后便会打开Message对话框,按照图示输入信息

在这里插入图片描述
电机Send便会发送CAN帧

2.3.2使用Python发接收数据

运行2.1.1的Python文件
在这里插入图片描述
可以看到每次点击Send,Python代码便会接收一帧数据

2.3代码间发送与接收数据:

为了便于同时显示发送端的代码运行结果以及接收端的代码运行结果和CAN King接收到的结果,我们将接收端代码在cmd中运行;使用效果如下:
在这里插入图片描述

3.参考文献

Python Canlib Documentation
file:///D:/Program%20Files%20(x86)/kvaserCAN/canlib/python/pycanlib/docs/index.html

4.结束语

如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ
在这里插入图片描述

标签:教程,Python,frame,canlib,number,收发,print,channel
From: https://www.cnblogs.com/xiondun/p/17648386.html

相关文章

  • 手把手教你在云环境炼丹:Stable Diffusion LoRA 模型保姆级炼制教程
    很多同学都想要自己的专属AI模型,但是大模型的训练比较费时费力,不太适合普通用户玩。AI开发者们也意识到了这个问题,所以就产生了微调模型,LoRA就是其中的一种。在AI绘画领域,只需要少量的一些图片,就可以训练出一个专属风格的LoRA模型,比如某人的脸、某个姿势、某种画风、某种物体,等......
  • 无涯教程-PHP - 局部变量函数
    Localvariables-局部变量在函数中声明的变量被认为是局部变量,也就是说,只能在该函数中引用它。该函数以外的任何赋值都将被视为与该函数中包含的赋值完全不同的变量-<?php$x=4;functionassignx(){$x=0;print"\$xinsidefunctionis$x.<br......
  • Python的wizard入门
    Wizard可以快速构建应用程序的图形化界面,下图是Wizard的工作区域介绍。第一步:打开AidLearning中的Wizard工具。单击第一个Layout_H容器,选中容器,在右侧属性窗口中将容器高度css_height调整为300px,容器宽度css_width也调整为300px。容器的默认名称为hbox0。第二步:给容器hbox0添......
  • 数据可视化教程来了!
    开源初衷Matplotlib可以说是python数据可视化最重要且常见的工具之一,几乎每个和数据打交道的人都不可避免,还有大量可视化工具是基于它的二次开发。开源教程的设计初衷源于笔者最初用python做数据可视化时面临两大痛点,绘图时现用现查,用过即忘,效率极低只会复制粘贴,不知其所以然,面对复......
  • python系列教程213
    声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值......
  • 无涯教程-PHP Installation on Windows NT/2000/XP with Apache函数
    要在Windows上使用PHP5安装Apache,请执行以下步骤。如果您的PHP和Apache版本不同,请相应注意。从www.apache.org/dist/httpd/binaries/win32下载Apache服务器。您需要具有no_src.msi扩展名的当前稳定发行版。双击安装程序文件进行安装;C:\ProgramFiles是一个常见的位置。安装......
  • python @property装饰器实现原理
    @property装饰器可以使一个对象的方法变成属性访问,比较方便,那么它是如何实现的呢?下面是一个自己动手实现的例子:classMyProperty:def__init__(self,fget=None,fset=None):self.fget=fgetself.fset=fsetdef__get__(self,instance,o......
  • python的几种常用用法(掌握)
    Python常用的自动化小脚本,必须收藏!原创 鬼仔 码农鬼仔 2023-08-1918:00 发表于广东前言大家好,我是鬼仔。今天给大家分享几个python常用的自动化小脚本。无论是日常生活,还是工作开发,这几个脚本都常常会用到!1. List转JSON、String转JSON2. 时间格式转换3.......
  • python 多线程
    在python中,I/O密集型任务可以用多线程的方式来实现(threading库);然而,对于计算密集型任务,由于python中全局锁GIL的存在,多线程并不能起到一个加速的作用。所以此时,一般使用多进程的方式实现(multiprocessing库)。多线程threading:一个人有与异性聊天和看剧两件事要做。单线程的她可......
  • Lnton羚通云算力平台如何在OpenCV-Python 中,来进行图像算术运算?
    在OpenCV-Python中,可以使用函数cv2.add()、cv2.subtract()、cv2.multiply()和cv2.divide()来进行图像算术运算。这些函数接受两个输入图像,并对其进行逐像素的运算。1.图像加法:OpenCV 是饱和运算(大于255算255),NumPy 是模运算(大于255会与256进行求模)。importnumpyasnpimpo......