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

+ - [2.2.1使用Kvaser Can King接收数据](#221Kvaser_Can_King_160)
	- [2.2.2使用Python发送数据](#222Python_170)
+ [2.3验证接收数据](#23_174)
+ - [2.3.1使用Kvaser Can King发送数据](#231Kvaser_Can_King_175)
	- [2.3.2使用Python发接收数据](#232Python_189)
+ [2.3代码间发送与接收数据:](#23_193)

配置环境

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

1.环境配置

1.1安装CAN通讯需要的包

pip install canlib

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:hurri\_cane@qq.com
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()



2.1.2发送数据代码
# author:Hurricane
# date: 2021/4/12
# File : CAN\_send.py
# E-mail:hurri\_cane@qq.com

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()


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

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

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按钮

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值