CAN总线之ISO15765协议(内含协议解析伪代码)-程序员宅基地

技术标签: CAN  

    ISO 15765协议是一种CAN总线上的诊断协议。其中ISO 15765-1包括物理层和数据链路层,ISO 15765-2对网络层进行说明,ISO 15765-3则是规定到应用层的具体服务。

    下面重点看下网络层,根据ISO 15765-2中的定义,网络层的功能是接收到应用层发送过来的消息流后,根据定义中的分包、位填充和时间控制等步骤,对消息流进行控制传输。流控制输有单帧传输、多帧传输两种类型,根据传输数据的长度进行帧传输方式的选择。

    相反当接收到来自诊断仪的数据时,网络层完成的是一个组包的过程,这时需要一个可以存放接收的缓冲区。单帧的组包相对简单,而接收到多帧数据则根据接收到的首帧和连续帧的数据域提取,后按照排列顺序重新组合交给上层的应用层。

    ISO 15765网络层的功能主要有:

    (1)为上层的应用层提供接口服务

    (2)进行内部操作。为上层服务提供接口从而实现数据流;主要有为对等实体间的通信提供分段、重组和流控制这几种方法

    (3)网络层中的时间控制。

    网络层原语服务分析:

N_PCI 则包含了原语帧的具体信息如:此消息帧属于何种帧类型(单帧、首帧、连续帧)、帧长度等

N_Data为该原语所包含的具体的数据。

网络层内部传输服务,CAN总线上的数据帧没帧只能传输8个字节,ISO 为了适应CAN总线上的数据传输,根据诊断报文数据长度的不同规定了单帧传输和多帧传输两种方式

1.单帧传输

当应用层的诊断服务数据可以利用单帧CAN数据传送时,可采用单帧传送方式

2.多帧传输

多帧传送方式中,网络层根据需要,将诊断数据进行拆分成一个首帧和多个连续帧。首帧包括了分段数据的总长度信息以及一些数据帧;每个连续帧的第一个字节包含拆分的顺序编号,后面的七个字节用于存放诊断数据。接收端在接收到连续帧后根据接收数据帧的编号重组服务数据。

    发送端和接收端通过N_PCI确认发送或者接收的帧为首帧、流控帧还是连续帧,

接收端通过对接收到数据帧的第一个字节进行分析就可以得出所接收到的数据帧为何种数据帧,以及所要接收的数据长度

接收的数据第一个字节的高四位为0则表示所接收的数据帧为单帧,再通过读取低四位以确定单帧数据中的有效字节长度

接收的数据的第一个字节为高四位为1则表示所接收的数据帧为多帧的首帧。再读取第四位和第二个字节后确认所需要接收的字节数后,根据接收的能力和双方通信的速率发送流控帧,然后等待多帧连续的到来。

接收的数据第一个字节的高四位为2则表示所接收的数据帧为多帧连续帧。然后在对SN连续帧编号之后的数据放入接收缓冲区

接收的数据第一个字节的高四位为3,则表示接收的数据帧为流控帧。低四位的FS表示所发送端所需要进行的动作,BS为能够发送连续帧的数据,STmin为每两帧的时间间隔。

网络层时间控制分析

网络层时间管理是为了保证发送端和接收端不会因为等待而永久挂起,从而失去通信能力,因此每次通话的过程中设置了超时的时间参数

N_As:发送端将数据传送到接收端的最大时间

N_Bs:发送端在成功发送首帧后到接收到流控帧的最大时间

N_Br:接收端在接收到首帧后到发送流控制的最大时间。

N_Ar:接收端将流控制传送到发送端的最大时间。

N_Cr :接收端在发送成功流控制后到收到连续帧的最大时间

Ttan:每帧传输时间。

STmin:连续帧之间的最小发送时间间隔。

根据这个传输流程我们可以得到诊断报文的传输延迟的公式:

T=N_As+N_Bs+N_Cr-Tan+(Ttan+STmin)N-STmin

附加一段相关伪代码:

if(接收长度!=内容长度)
{
  
    for(i=内容长度;i<接收长度;i++)//比较实际内容长度外的部分是否因为补0,不相等
	   {
		    if(OBDReceBuf[i]==0)
					 break;
				else
					 return ;		 
		 
		 }
}

if((change0.byte.LL>0x20)&&(Frames_remain!=0))
{
  count++;
	Frames_remain--;//还需要接收的剩余帧次数
	tmp = change0.byte.LL & 0x0F;
	 p = (INT8U *)&p_caninfo->DATAA;
	if(T5ms-FirstTime<STmin) return;//如果不在规定时间内接收到数据,返回
	if(count==1) SN[0]=*p;//记录第一个序列号
	if(*p+1==(SN[0]+ count))	
	   FirstTime=T5ms;//记录上一次收到连续帧的时间
   memcpy(OBDReceBuf+1+tmp*7, &p[1], 7);//接收数据
	if(Frames_remain==0){
  
       DIAG_ReceOver_Flag=1;
     }
        else{
            DIAG_ReceOver_Flag=0;
      }
}
if((change0.byte.LL&0xF0)==0x30)
{
   p = (INT8U *)&p_caninfo->DATAA; 
	 STmin=*p+2;
}

	case CAN_LINK_SEND_DATA:
			 if(T5ms-can_lind_time<STmin) return 0;//连续发送的数据满足最小时间间隔		

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dop102/article/details/80318141

智能推荐

unity 物体沿某一坐标轴旋转_unity 绕一轴旋转-程序员宅基地

文章浏览阅读715次。obj.transform.Rotate(0, fRotateSpeed * Time.deltaTime, 0, Space.Self);_unity 绕一轴旋转

【测试】8bit和4bit量化对模型在MMLU数据集上准确率的影响_q4量化 mmlu-程序员宅基地

文章浏览阅读859次,点赞30次,收藏16次。下面是改变其中某个参数后在 MMLU 数据集上的准确率,可以看出即使是 4bit 对准确率影响都没有很大,首 Token 性能还可以接近原精度,还节省了大量的空间。ms,最后的测试结果还算比较接近官方的结果,以此作为 baseline 和量化后的模型权重对比推理下游任务准确率的损失情况。),4bit 量化包含两种 4bit 的数据类型 FP4 和 NF4,以及。Mistral-7B 是一个很强的 7B 开源模型,在 Mistral。)并直接在原精度(BF16)上进行推理,尝试复现出官方的准确率。_q4量化 mmlu

python——飞机大战小游戏_python小游戏代码飞机大战-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏22次。先安装一下pygame这个库然后将素材烤入,一些飞机图片和背景需要修改一下编辑器不然会找不到草率了,貌似得再pycharm里下载pip下载的它找不到我又重新下载了一下再右面加号新建一个解释器选择本地python.exe,把公开它的库选上终于好了。_python小游戏代码飞机大战

Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera)_如何使用carla仿真语义分割模型-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏15次。本节的内容是生成一个语义分割相机,主要分为:四部分。一、初始化世界以及添加车辆二、生成语义分割相机Semantic segmentation camera三、监听语义分割相机,进行数据处理四、呈现最终效果一、初始化世界以及添加车辆这一节承接之前生成车辆的内容(Carla生成车辆).设置vehicle 为自动控制模式1.添加车辆的完整代码为:import globimport osimport sysimport timeimport randomimport._如何使用carla仿真语义分割模型

"Java:comp/env/"讲解与JNDI_comp.env.ejb.dbtableoperlocal-程序员宅基地

文章浏览阅读567次。我们在使用JNDI调用某个对象时,会有下述两种方式context.lookup(“Java:comp/env/XXX”) context.lookup(“XXX”)context.lookup(“java:comp/env/XXX”)只能用在J2EE环境,如果你自己写一个main函数,想通过context.lookup(“java:comp/env/XXX”)这样的方式_comp.env.ejb.dbtableoperlocal

2022年下半年系统架构设计师下午真题及答案解析_系统架构设计师真题-程序员宅基地

文章浏览阅读1.4w次,点赞10次,收藏63次。新系统除了保持现有的四级固定会员制度外,还需要根据用户的消费金额、偏好、重复性等相关特征动态调整商品的折扣力度,并支持在特定的活动周期内主动筛选与活动主题高度相关的用户集合,提供个性化的打折促销活动。系统的故障检测和诊断是宇航系统提高装备可靠性的主要技术之一,随着装备信息化的发展,分布式架构下的资源配置越来越多、资源布局也越来越分散,这对系统的故障检测和诊断方法提出了新的要求。因为宇航系统是一个非常复杂的系统,如果采用张工的基于解析模型的方法,这一类方法需要建立再精准数学模型的基础上来进行故障诊断。_系统架构设计师真题

随便推点

eclipse配置lombok以及使用_eclipse lombok enable-程序员宅基地

文章浏览阅读1.5k次。一、下载lombok.jar包,jar包下载路径:https://projectlombok.org/download二、将lombok.jar包复制到eclipse安装目录三、使用notepad++ 打开eclipse.ini,在最后添加以下代码并保存:-Xbootclasspath/a:lombok.jar-javaagent:lombok.jar 注意:-X..._eclipse lombok enable

西华计算机系研究生好不好,西华大学考研难吗?一般要什么水平才可以进入?...-程序员宅基地

文章浏览阅读1.8k次。首先,申明一点:考研本身就不是一件容易的事情,在考研的过程中,找准自己的定位、学会搜集资料、搜集信息并且辅之于踏实的备考、准确的方法是至关重要的。同时,要学会坚持,不忘初心,很多同学在开始备考时,斗志昂扬,但是在进度接近尾声时,自己的志气也接近了尾声,这是万万不行的。有句话说的好:“骆驼走得慢,但终能到达终点”。我们也是,过程中,要循序渐进的进步,一步一步的坚持备考,终能到达彼岸。接下来,给大家一..._西华大学计算机考研好考吗

搭建Windows Server 2008故障转移群集-程序员宅基地

文章浏览阅读255次。本文章将详细讲述基于Windows Server 2008 R2的故障转移群集的实现,包括基本知识介绍,故障转移群集环境准备,实施过程,群集的维护等。故障转移群集可以配置使用多种不同的配置。组成群集的服务器可以是活跃状态或不活跃状态,而不同服务器可以被配置为在活跃服务器故障后立刻接管相应的资源。一般故障转移的过程只需要几分钟的时间,至于时间的长短主要取..._安装故障转移群集中的验证配置步骤,测试工作包括

【深大C语言OJ】对齐输出(格式化输出)_深大oj-程序员宅基地

文章浏览阅读748次,点赞19次,收藏9次。因为是输出部分的变化,所以我们需要调整printf函数中的内容,因为默认就是右对齐输出,所以这个可以不用管;至于占8个字符输出,将%d改为%8d即可。此题在输出整数的基础上多了两个要求,一个是每个整数占8个字符的宽度输出,一个是右对齐输出。另外还需要注意三个整数之间要用空格分开。只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。只有一行,包含三个整数,整数之间以一个空格分开。_深大oj

Java面试题-数据结构_数据结构面试-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏37次。八大基本数据结构以及衍生相关数据结构_数据结构面试

JVM详解之:java class文件的密码本_java 密码本-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏5次。一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。下面,让我们开始这个激动人心的过程吧。_java 密码本

推荐文章

热门文章

相关标签