在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程

news2024/12/24 9:28:22

目录

  • 前言
  • 一、VectorCANdb++下载及安装
  • 二、DBC文件的编写
    • 1.新建dbc文件
    • 2.建立dbc
      • 2.1根据CAN协议设置以下的signals
      • 2.2设置报文
      • 2.3建立报文与信号的关系
      • 2.4建立节点
  • 三、编写程序使用UDP通信下发can协议
    • 1.查看can口、电脑ip以及端口号
    • 2.编写测试程序


前言

最近完成了一个项目,给了一个底盘,还有底盘的CAN协议,来写通底盘。CAN协议之前接触过,DBC文件是第一次接触,走了不少弯路,在此记录一下整个工作的完整流程。


一、VectorCANdb++下载及安装

参考链接:
CANdb++从安装到使用
WIN10下CANdb++编辑器的下载和安装

注意要在windows系统下安装
VectorCANdb++下载链接:https://www.vector.com/cn/zh/download/candb-31-sp3/
在这里插入图片描述下载完了一直点击nex即可完成安装


二、DBC文件的编写

参考链接:
CAN db++(创建DBC文件)学习笔记
关于DBC文件的创建(DBC文件系列其一)

参考链接里面详细介绍了下面编写DBC文件过程中,每个参数的含义

首先给出一份CAN协议
在这里插入图片描述

1.新建dbc文件

点击File->Create Database
在这里插入图片描述选择CANTemplate.dbc后点击OK
在这里插入图片描述创建文件名
在这里插入图片描述新建完成后出现
在这里插入图片描述

2.建立dbc

2.1根据CAN协议设置以下的signals

点击signals->new
在这里插入图片描述

Value Type选择UnsignedLength(信号字节长度)、Factor(数据精度)、MinimumMaximum根据表格来填。
注意:1.协议中给出的是十六进制数,而这边的最大值最小值范围是十进制数。2.协议中第2、3个字节没有定义数据,那么就默认为0,我们在这边也把这个signal定义一下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2设置报文

在这里插入图片描述
在这里插入图片描述

2.3建立报文与信号的关系

鼠标左键按住设置好的signals,拖动到EPS2上面,注意顺序要与文件中顺序一致
在这里插入图片描述全都拖好了,双击EPS2,然后点击Layout,如下图所示,可以检查一下报文设置是否正确(图片上的字节顺序,从右至左,从上到下,依次增大)

在这里插入图片描述

2.4建立节点

1.建立发送和接受节点
右键点击Network nodes -> New
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.将需要发送的报文拖到目标节点下的Tx Messages下面

我上面的例子只编写了一条message,其他的message同理。下面图片中我一共编写了四条message,就不一一展示了。

在这里插入图片描述
3.设置需要接受的报文
双击打开Receive,选择Mapped Rx Sig.,然后选择Add:all from one message

在这里插入图片描述
选择需要接收的报文,点击ok

在这里插入图片描述
4.检查节点间的收发关系
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
5.can网络自动检查

在这里插入图片描述
在这里插入图片描述
没有错误,至此,DBC文件编写成功
我们可以右键编好的文件,使用文本打开,查看DBC文件的解析。
DBC文件的解析的参考链接:
DBC文件学习
汽车行业DBC文件解析 | Python 解析dbc文件


三、编写程序使用UDP通信下发can协议

参考链接:ubuntu下使用python进行简单的UDP通信

1.查看can口、电脑ip以及端口号

查看can盒底部默认ip为192.168.4.101,下面修改本机ip在同一网段下
在这里插入图片描述

接着安装wireshark

sudo apt install wireshark

然后打开wireshark

sudo wireshark

在这里插入图片描述
显示网络已经通了,而且得到了
CAN盒ip:192.168.4.101,端口号:6666
本机ip:192.168.4.100,端口号:8882

2.编写测试程序

编写了一段程序用来测试UDP通讯,注意修改ip与端口号
下面的程序使用了cantools库,首先安装一下这个库pip3 install cantools使用python3运行该程序(python3 xxx.py)

# -*- coding:UTF-8 -*-
import socket
import cantools
from binascii import hexlify

def main():
    # 1. 创建socket套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # AF_INET表示使用ipv4,默认不变,SOCK_DGRAM表示使用UDP通信协议
        
    # 2. 绑定端口port
    local_addr = ("192.168.4.100", 8882)  # 本地ip,指定端口号7878
    udp_socket.bind(local_addr)  # 绑定端口
    
    # 3. 加载dbc文件
    db = cantools.database.load_file('/home/smart_car/DBC_File/text.dbc')
    # example_message = db.get_message_by_name('VCU')

    # 4. 接受UDP数据包并解析CAN信号值
    # recv_data = udp_socket.recvfrom(1024)  # 定义单次最大接收字节数
    # recv_msg = recv_data[0]  # 接收的元组形式的数据有两个元素,第一个为发送信息
    # send_addr = recv_data[1]  # 元组第二个元素为发信息方的ip以及port
    # print(recv_msg)
    # can_data = db.decode_message(example_message.frame_id, recv_msg)  # 解析CAN信号值
    # print(can_data)

    # 5. 输入CAN信号的名称和值,并发送CAN数据包
    # (控制方向盘转到100°,转速100)的指令:08 00 00 04 69 20 00 00 04 64 00 64 24
    data_1 = { 
    'Work_mode': 32,
    'Stay0': 0, 
    'Stay1': 0, 
    'Steer_Angle_H': 4, 
    'Steer_Angle_L': 100, 
    'Angle_alignment': 0, 
    'Angular_velocity': 100, 
    'Check': 36}

    while True :
        # (控制方向盘转到100°,转速100)的指令:08 00 00 04 69 20 00 00 04 64 00 64 24
        message_move = db.encode_message("EPS2", data_1)
        message_2 = bytes([0x08, 0x00, 0x00,0x04, 0x69])
        message_3 = message_2 + message_move
        # print(hexlify(message).decode('ascii'))
        # print(message)
        udp_socket.sendto(message_3, ("192.168.4.101", 6666))

if __name__ == "__main__":
    main()

解释说明
1.程序作用
上面的程序一部分是接受底盘CAN协议并且利用DBC文件解码;另一部分是编写一条指令,然后利用DBC文件编码,然后用UDP发送给底盘
2.两行代码解释

message_2 = bytes([0x08, 0x00, 0x00,0x04, 0x69])
message_3 = message_2 + message_move

加这个的原因是,一个标准的CAN协议包含帧信息、帧ID和帧信息,而利用db.encode_message()函数进行DBC编码的时候,只编码了最后八个字节的帧数据,所以将第一到五个字节的信息手动添加进去(前五个字节的信息是固定的)。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热烈庆祝兴业法拍网与宁波银行北京分行签订“法拍贷”业务合作

6月1日,兴业法拍网与宁波银行北京分行签订“法拍贷”合作协议。 “法拍贷”是以法院房产拍卖为核心、线上平台拓宽拍卖渠道、保险公司提供阶段性保证、公证机构加大司法效力、银行提供全程金融服务的“14”创新合作模式。该模式汇聚五方合力让更多竞拍人享受到便利…

2天时间3个面试,百度进了3面!

昨天和朋友复盘了一下最近的面试经历,分享给大家: 关于就业环境 忠告:如果不是在二三线买车买房结婚生子了,还是到一线城市去吧。 或者换个行业! 关于焦虑和摆烂 如果你也在焦虑迷茫、精神内耗。找阳哥给你做“心理…

spring-boot版本影响Spring AOP @Before @Around @After等执行顺序

郁闷了半天,我通过AOP切面打印的日志顺序怪怪的,网上查了好几篇文章都说没问题,最后发现是springboot版本升级后Before Around After等执行顺序发生了变化。 1.切面类 Aspect// 这是一个切面 Component// 这是一个需要被装配的spring bean S…

零基础如何实现 Python 自动化办公 ?

996 一直是互联网老生常谈的话题了,但抛开其他只谈工作本身,你有没有想过,下班晚、加班,有时候可能是因为自己工作比较低效? 在这给你分享一个案例: 场景是在维护日活超过 3 亿用户的微博私信平台&#x…

Linux开机rc.local不自启动执行脚本其他一些问题进行补充说明

Linux开机rc.local不自启动执行脚本其他一些问题进行补充说明 在上一篇,我们讲了Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决 这一篇我们补充一些其他的问题 问题一:我怎么知道我rc.local里面的命令启动成功不成功呢,我怎…

为什么说 Java 比 C / C++ 慢?

因为C/C允许程序员做出更多选择。 选择更多,那么: 弊端:开发效率难以提高,因为有太多选择需要斟酌。 优势:执行效率可以逼近极限,因为不会有什么抽象拦住你。 举个例子吧:大家可能对Java无处不…

New bing出现“重定向”无法使用解决方法来了

我又来分享干货了!!! 因为要润色论文,又是经过几天的折腾,终于可以正常使用bing聊天了,泪目! 首先你要有VPN才能使用New bing聊天的!要求使用edge浏览器(虽然我最后用的…

电脑mp3转换器哪个好用?我来告诉你电脑mp3转换器哪个好

假如你下载了一些音乐或者录音文件,但是它们可能不是mp3格式的,而是其他格式,如wav、flac等。而有一些设备又只能播放mp3格式的音频,这时候就需要使用mp3转换器将其转换成mp3格式,以便于在各种设备上播放和分享。不过你…

RustChinaConf 2023官网上线,精彩议题早知道

随着大会日益临近,我们RustChinaConf 2023筹备委员会的工作也在有条不紊的进行中。最新的好消息来了,官网已上线,访问地址: https://rustcc.cn/2023rustchinaconf/ 从官网进去也可以报名! 大会时间地址 6.17 - 6.1…

电影《异形》标志性雕塑将分割为500个NFT出售

由佳士得前高管领导的美术平台Particle曾创造历史般售出班克西的《爱在空中》的10000件数字作品。 5 月 31 日 - Particle ,作为去中心化的艺术生态系统和Banksy 的“Love is in the Air”画作的代币商,它将让收藏者有机会购买H.R. Giger的《异形3》原创…

我发现3个国内一直能用的免费版ChatGPT 免登免注册无广告 再不赶紧保存就没啦!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

Linux多Reactor多线程网络模型

多Reactor多线程网络模型是一种用于构建高性能网络应用的并发模型。它基于事件驱动的思想,通过使用多个Reactor线程和多个工作线程来处理并发的网络请求。 底层调用关系: 在多Reactor多线程网络模型中,通常会有一个主Reactor线程和多个工作线…

凌云出海 决胜万里丨华为云中企出海领袖班第五期顺利结束!

互联网大潮风起云涌,国内竞争日益激烈内卷,越来越多的互联网企业选择国际化走出去,在全球市场这个更大舞台上找寻机会。想要抓住技术红利并惠及企业全球化,成为当下众多出海从业者的共识。 为了帮助更多的CTO领袖具备更专业的国际…

【大模型】人工智能大模型在自动驾驶领域的应用

随着ChatGPT的火爆,大模型受到的关注度越来越高,大模型展现出的能力令人惊叹。 第一个问题:怎样的模型可以称之为大模型呢? 一般来说,我们认为参数量过亿的模型都可以称之为“大模型”。而在自动驾驶领域,大…

Hibernate框架【四】——基本映射——多对一和一对多映射

系列文章目录 Hibernate框架【三】——基本映射——一对一映射 基本映射——多对一和一对多映射 系列文章目录前言一、多对一映射是什么?1.案例:现在有两个实体User实体和Group,其中多个User属于一个Group,表现出多对一的关系。①…

图解LeetCode——98. 验证二叉搜索树

一、题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 二、示例 2.1>…

扫描出项目中未被引用的控制器接口的工具类(超级好用)

自己的项目随着不断开发迭代,越来越庞大,后台的接口也就越来越多,难免会有一些接口后来并没有使用到,但是还在代码中,权限管理的时候这部分接口是非常多余的,为了避免这个问题,本章提供了一个工…

回归测试最小化(贪心算法,帕累托支配)

回归测试最小化(贪心算法,帕累托支配) 介绍 有时我们不能只是重新运行我们的测试(例如,当我们 换界面)。 回归测试可能很昂贵: (1)一些公司通宵运行回归测试套件。 (2) 对于嵌入式系统,我们可能必须测试正在使用的软件&#xff0…

党校学员毕业自我鉴定总结样文分享

党校学员毕业自我鉴定总结样文分享1 岁月匆匆似流水,美好的研究生三年时光马上就快结束了。经过良师的悉心指导以及自己的努力奋力拚搏、自强不息,我渐渐的成为了一个能适应现代社会要求的硕士毕业生,并为做一个知识型的社会主义建设者打下坚…

Web应用技术(第十四周/END)

本次练习基于how2j和课本,初步认识Spring。 以后我每周只写一篇Web的博客,所有的作业内容会在这篇博客中持续更新。。。 一、Spring基础1.Spring概述:2.Sring组成:3.BeanFactory:4.控制反转:5.依赖注入:6.JavaBean与S…