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

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

  • 配置环境
  • 1.环境配置
  • 1.1安装CAN通讯需要的包
  • 1.2 安装kvaser_drivers以及Kvaser CanKing
  • 2.使用Python收发数据
  • 2.1接发数据代码如下:
  • 2.1.1接收数据代码
  • 2.1.2发送数据代码
  • 2.2验证发送数据
  • 2.2.1使用Kvaser Can King接收数据
  • 2.2.2使用Python发送数据
  • 2.3验证接收数据
  • 2.3.1使用Kvaser Can King发送数据
  • 2.3.2使用Python发接收数据
  • 2.3代码间发送与接收数据:
  • 3.参考文献
  • 4.结束语
  • 配置环境

    使用环境: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按钮

    点击后便会打开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.结束语

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

    来源:Hurri_cane

    物联沃分享整理
    物联沃-IOTWORD物联网 » CAN通讯-使用Python收发CAN数据保姆级教程(包含完整代码)

    发表评论