免费在线网站建设,本地网站建设电话,网页建站建设教程,郑州做网站推广电目录 前言一、VectorCANdb下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.2设置报文2.3建立报文与信号的关系2.4建立节点 三、编写程序使用UDP通信下发can协议1.查看can口、电脑ip以及端口号2.编写测试程序 前言
最近完成了一个项目下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.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数据精度、Minimum与Maximum根据表格来填。 注意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盒ip192.168.4.101端口号6666 本机ip192.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 hexlifydef main():# 1. 创建socket套接字udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # AF_INET表示使用ipv4,默认不变SOCK_DGRAM表示使用UDP通信协议# 2. 绑定端口portlocal_addr (192.168.4.100, 8882) # 本地ip指定端口号7878udp_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 24data_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 24message_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编码的时候只编码了最后八个字节的帧数据所以将第一到五个字节的信息手动添加进去前五个字节的信息是固定的。