CAN15765和1939协议

news2024/9/28 1:23:01

1. 15765协议介绍

简单的来说,15765协议指的是

基于CAN2.0A/B 协议 (也可以叫做ISO11898协议 -链路层)

硬件接口的 应用层 通讯协议,

它用于实现通用的车辆诊断服务。

ISO11898协议参考下图。

参考搜索到的“CAN总线协议讲解”文档。

它规定了:

1、总线 CAN_H 和 CAN_L 之间要连接120欧姆电阻。

2、CAN总线为隐性时(即逻辑电平为1时)总线电压差为0V(图示默认电平都为2.5V)。

CAN总线为显性时(即逻辑电平为0时)总线电压差为2.0V左右(图示电平为3.5V和1.5V)。

3、总线通讯速度在125K到1M 比特率每秒。

 

2. 协议数据单元PDU

这是硬件层的。

15765中一个PDU就是一帧CAN数据。它主要包括:帧ID和(最多8个)字节数据。

帧ID分29bit的扩展帧和11bit的标准帧。

整体格式见下图,具体内容要去参考CAN2.0协议(ISO11898)。

 

3. 服务数据单元FDU

由1到多个PDU组成FDU,其组织方式可以简单理解为就是15765协议。

PDU有4个类型:

1)单帧

帧数量为1,也即数据不超过8个字节。

首字节表示长度,后面紧跟数据。

如 02 3E 00  //长度为2,诊断ID为0x3E 子数据为00

2)多帧首帧

帧数量大于1,也即数据超过8个字节。

首字节的前4bit为1表示为多帧首帧。

首字节左移8位 再加上次字节表示数据长度,也即数据最大为4095个字节。

如 10 08 01 02 03 04 05 06 //多帧首帧,且数据长度为8,后面6个是有效数据

3)多帧数据帧

首字节的前4bit为2表示为多帧首帧。

首字节的后4bit表示序号,第一包从1开始,后面顺序递增,递增超过15时从0开始。

10 08 01 02 03 04 05 06 //首帧

30 00 00 00 00 00 00 00 //流控帧

21 07 08 //数据帧

4)多帧流控帧

首字节的前4bit为3表示为多帧流控帧。

首字节的后4bit表示响应码,00表示正常,可以继续发送数据,否则应当停止后续发送。

第三个字节一般表示多帧发送延时,一般为00表示后续多帧数据帧之前发送间隔为0,为1表示要间隔1ms发送。

其它位置各家厂商定义不尽相同,有些甚至不用流控帧。

4. 15765组包和拆包实现

4.1 准备环境

我们准备2个设备,连接CAN高和CAN低。默认配置好和打开CAN-1M 波特率通讯。

发送数据(发起端发送ID用18FFFFFF):

{
    "cmd":"get_vol",
    "from":"master",
    "to":"device"
}


压缩:

{"cmd":"get_vol","from":"master","to":"device"}

转Hex:7b22636d64223a226765745f766f6c222c2266726f6d223a226d6173746572222c22746f223a22646576696365227d

数据长度为47 即0x2F

响应数据(接收端响应ID用18FFFFFE):

{
    "cmd":"23.89v",
    "from":"device",
    "to":"master"
}


压缩:

{"cmd":"23.89v","from":"device","to":"master"}

转Hex:

7b22636d64223a2232332e383976222c2266726f6d223a22646576696365222c22746f223a226d6173746572227d

数据长度为46 即0x2E

4.2 组包

由于发送数据长度大于8,需要多包方式进行组包。

首包及数据包可拆解如下:

发起端:
10 2F 7b 22 63 6d 64 22 //发送
30 00 00 00 00 00 00 00 //响应
21 3a 22 67 65 74 5f 76 //发送
22 6f 6c 22 2c 22 66 72
23 6f 6d 22 3a 22 6d 61
24 73 74 65 72 22 2c 22
25 74 6f 22 3a 22 64 65
26 76 69 63 65 22 7d 00 //空余1字节填充00

接收端:
10 2E 7b 22 63 6d 64 22 //发送
30 00 00 00 00 00 00 00 //响应
21 3a 22 32 33 2e 38 39 //发送
22 76 22 2c 22 66 72 6f
23 6d 22 3a 22 64 65 76
24 69 63 65 22 2c 22 74
25 6f 22 3a 22 6d 61 73
26 74 65 72 22 7d 00 00

发起端流程:

先发送10帧,等待30帧响应。

收到30帧正响应后,按顺序将21~26 共6包数据依次发出去。

然后再等待接收ID的10帧。收到后要立即响应30帧。

然后读取或缓存收到的2x数据帧,提取有效数据用Json API进行解析。

4.3 拆包

对于发送端的数据,组好包的数据只管发送。

处理接收时要进行逐个判断。

参考代码如下:

int ISO15765CanFrameRxDeal(uint8_t data, uint32_t id)
{
	switch(data[0]&0xF0)
	{
		case 0x00://单帧
		//单帧可以当场处理掉
			break;
			
		case 0x10://首帧
		//1,提取要接收的长度
		//2,根据长度或这包数申请内存buf(或者创建/清空数据队列)
		//3,缓存第一包的6byte数据
		//4,发送30帧响应
			break;
			
		case 0x20://数据帧
		//根据包序号判断是否接收完毕
		//将数据缓存到buf(或者将数据写入队列)
			break;
			
		case 0x30://流控帧
		//发送完10帧后等待30帧,一般判断是不是30帧正响应即可
			break;
	}
}

5. J1939协议

1939和15765 硬件层面完全相同的,只不过1939规定了250K波特率通讯。

且用于商用车、卡车客车的网络通讯,是一种广播的网络形式,车上一般规定用6/14针脚-250K波特率进行通讯。

如下图,商用车中,

仪表、空调、后处理、行程记录仪、发动机、变速箱等等都要讲必要数据以广播形式发到CAN网络中。通常所见的车上仪表盘,其实就是监听和解析广播帧ID数据(车辆通信内容可以轻易破解)。

 

对于不同的车上模块,如何区分不同模块的数据,

第一个就是帧ID,以及PGN。

对于1939的PDU,帧ID和数据部分定义如下:

1)1939固定250K通讯,帧ID采用29bit,也即4个字节

2)帧ID第一个字节的5个有效bit中,

前3bit定义为P-仲裁优先级

第4和5bit定义为扩展数据页及数据页

3)帧ID第二个字节表示PF,即PDU格式

PF值区间为0~239(0x00~0xEF),则表明是PDU1格式,如区间为240~255(0xF0~0xFF),则表明是PDU2格式

4)帧ID第三个字节表示PS,PDU Specific

如为PUD1格式,则该场表示帧的目标地址,如为PDU2格式,则表示组扩展GE

5)帧ID第四个字节表示SA,即源地址

源地址即表示从哪来的,协议规定:00为发动机,3D为后处理,17/21为仪表,等等

那么简单的来说,PGN就是由PF和PS组成,即帧ID的第2/3字节。(完整的PGN定义由EDP+DP和PF、PS共三个字节组成,但是由于EDP和DP一般全部都为00,所以忽略了帧ID的第1字节)

实际应用场景中,就是监听车上广播ID,根据PGN规则和协议匹配对应的数据流或故障码解析规则,进而解析数据。

如商用车一般都有的0x0CF00400广播数据,其有效数据为8字节。对于PGN为 00F004

可以根据ID直接匹配。以小端序提取其第4和5字节,除以80得到车上发动机的转速值。

同样的,1939协议中也有多帧数据,一般其内容是故障码数据,以及复杂或扩展数据。

PGN 00FECA 表示当前故障

PGN 00FECB 表示历史故障

PGN 00FECC 表示清除故障

车上多帧数据一般用两个帧ID表示,一个帧ID表示首帧,一个帧ID表示数据帧。

首帧不含有效数据,首字节一般为10或20表示不同的寻址方式,2/3字节表示长度,第4字节表示包数,5字节填充,6/7/8字节填充PGN。

数据帧首字节表示包数,剩余7字节为有效数据。

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

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

相关文章

【MySQL】索引特性

​🌠 作者:阿亮joy. 🎆专栏:《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉没…

蓝图节点编辑器

打印字符串 第02章 蓝图结构 03 -注释和重新路由_哔哩哔哩_bilibili 第02章 蓝图结构 04 - 变量_哔哩哔哩_bilibili 第03章 蓝图简易门 01 - 箱子碰撞_哔哩哔哩_bilibili 第03章 蓝图简易门 02 - 静态Mesh和箭头_哔哩哔哩_bilibili 第03章 蓝图简易门 03 - 设置相对旋转节点_哔…

流数据湖平台Apache Paimon(三)Flink进阶使用

文章目录 2.9 进阶使用2.9.1 写入性能2.9.2 读取性能2.9.3 多Writer并发写入2.9.4 表管理2.9.5 缩放Bucket 2.10 文件操作理解2.10.1 插入数据2.10.2 删除数据2.10.3 Compaction2.10.4 修改表2.10.5 过期快照2.10.6 Flink 流式写入 2.9 进阶使用 2.9.1 写入性能 Paimon的写入…

c++ 类的特殊成员函数:拷贝构造函数(四)

1. 简介 拷贝构造是一种特殊的构造函数,用于创建一个对象,该对象是从同一类中的另一个对象复制而来的。拷贝构造函数通常采用引用参数来接收要复制的对象,并使用该对象的副本来创建一个新对象。 2. 结构 class MyClass { public:MyClass(c…

一种新的基于区域的在线活动轮廓模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

SpringBoot热部署的开启与关闭

1、 开启热部署 &#xff08;1&#xff09;导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId> </dependency>&#xff08;2&#xff09;设置 此时就搞定了。。。 2、…

TCP网络通信编程之网络上传文件

【图片】 【思路解析】 【客户端代码】 import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;/*** ProjectName: Study* FileName: TCPFileUploadClient* author:HWJ* Data: 2023/7/29 18:44*/ public class TCPFil…

解决在云服务器开放端口号以后telnet还是无法连接的问题

这里用阿里云服务器举例&#xff0c;在安全组开放了对应的TCP端口以后。使用windows的cmd下的telnet命令&#xff0c;还是无法正常连接。 telnet IP地址 端口号解决方法1&#xff1a; 在轻量服务器控制台的防火墙规则中添加放行端口。 阿里云-管理防火墙 如图&#xff0c;开放…

Windows 11 下 OpenFace 2.2.0 的安装

写在前面 最近需要做关于面部的东西&#xff0c;所以需要使用到OpenFace这个工具&#xff0c;本文仅用来记录本人安装过程以供后续复现&#xff0c;如果可以帮助到读者也是非常荣幸。 安装过程 不编译直接使用 这种方法可以直接从官方下载下来编译好的exe以及gui进行使用&a…

1000Wqps生产级IM,怎么架构?

前言 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿高薪&#xff0c;完成架构的升级&#xff0c;进入架构师赛道&#xff0c;打开薪酬天花板。 然后&#xff0c;在架构师的面试过程中&#xff0c;常常会遇到IM架构的问题&#xff1a; 如果要你从0到1做IM架构…

python与深度学习(十):CNN和cifar10二

目录 1. 说明2. cifar10的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试。首…

Flutter 使用texture_rgba_renderer实现桌面端渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频&#xff08;本…

MySQL高级篇第3章(用户与权限管理)

文章目录 1、用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其他用户密码1.7 MySQL8密码管理 2、权限管理2.1 全新列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 3、权限表3.1 user表3.2 db表3.3 tables_priv表…

ssti总结转载

一、初识SSTI 1、什么是SSTI&#xff1f; SSTI就是服务器端模板注入(Server-Side Template Injection)&#xff0c;实际上也是一种注入漏洞。 可能SSTI对大家而言不是很熟悉&#xff0c;但是相信大家很熟悉SQL注入。实际上这两者的思路都是相同的&#xff0c;因此可以类比来分…

【嵌入式Linux系统开发】——系统移植概述

目录 &#x1f349;&#x1f349;一、什么是嵌入式系统 &#x1f349;&#x1f349;二、嵌入式系统操作 &#x1f349;&#x1f349;三、嵌入式Linux的特点 &#x1f349;&#x1f349;四、嵌入式系统的组成 1、硬件和软件 2、硬件层 3、中间层 4、软件层 5、 功能层与执…

手动创建一张“资产负债表”和“利润表”

1. 前言 了解了“复式记账法”&#xff0c;以及“增值税”等概念后&#xff0c;让我们通过一个简化的例子&#xff0c;来手动创建一张资产负债表和利润表&#xff0c;进而加深对于记账和这两种报表的理解。 2. 手动创建财务报表 2.1 期初余额 假设某公司的2022年度期初余额…

找不到vcruntime140.dll无法继续执行代码怎么办?(详解)

1.vcruntime140.dll是什么&#xff1f;有什么作用&#xff1f; vcruntime140.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它属于Microsoft Visual C Redistributable的一部分。DLL是Dynamic Link Library的缩写&#xff0c;它包含了一系列函数和资源&#xff0c;…

C计数问题---2023河南萌新联赛第(三)场:郑州大学

解析&#xff1a; n 可以分成两个数&#xff0c;记录每个数的因子对数&#xff0c;乘起来即可。 注意当因子相同时&#xff0c;只1 #include<bits/stdc.h> using namespace std; int n,res; int main(){cin>>n;for(int i1;i<n;i){int xi,yn-i;int cnt10,cnt20;…

【周末闲谈】剑指offer,了解面试,学会面试

我们在找工作时&#xff0c;需要结合自己的现状&#xff0c;针对意向企业做好充分准备。作为程序员&#xff0c;你有哪些面试IT技术岗的技巧&#xff1f; 你可以从一下几个方向谈谈你的想法和观点。 个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️…

DHCP中继代理原理(第二十八课)

当客户机和DHCP服务器不在一个广播域时,DHCP服务器无法接收到客户机的DHCP discover广播数据包,客户机就无法获得IP地址 第一步配置DHCP服务器的信息 <Huawei>u t m //清除日志 Info: Current terminal monitor is off. <Huawei>sys [Huawei]sysname DHCP-R…