当前位置:   article > 正文

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

python发送can报文

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

"""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
    ))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

#### 2.1.2发送数据代码



  • 1
  • 2
  • 3
  • 4
  • 5

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帧的规则就行



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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`  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210416173200867.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYWthbGFrYVBIRA==,size_16,color_FFFFFF,t_70)


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


#### 2.2.2使用Python发送数据


运行2.1.2的Python文件  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210416174925205.gif)  
 可以看到运行一次代码,Kvaser Can King便会接收一帧数据


### 2.3验证接收数据


#### 2.3.1使用Kvaser Can King发送数据


与2.2.1同样打开CAnKing软件


* 设置CAN通道为0
* 设置波特率为500K
* 点击按钮`Go On Bus`  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210416173200867.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYWthbGFrYVBIRA==,size_16,color_FFFFFF,t_70)


现在CAN的0通道便打开了,在右侧Output框可以显示发送以及接收到的数据  
 按照下图打开`Universal`按钮  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210416175547541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYWthbGFrYVBIRA==,size_16,color_FFFFFF,t_70)  
 点击后便会打开Message对话框,按照图示输入信息


![在这里插入图片描述](https://img-blog.csdnimg.cn/2021041617570528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYWthbGFrYVBIRA==,size_16,color_FFFFFF,t_70)  
 电机Send便会发送CAN帧


#### 2.3.2使用Python发接收数据




![img](https://img-blog.csdnimg.cn/img_convert/9e18807e9ce6e99446e72bf36033958c.png)
![img](https://img-blog.csdnimg.cn/img_convert/c2b8625b60a3c8782afb3f57d9e2783f.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号