SAE-J1939协议入门解析

2023-11-30 17:28
文章标签 入门 协议 解析 sae j1939

本文主要是介绍SAE-J1939协议入门解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、SAE J1939物理层
  • 二、SAE J1939数据链路层
    • 1、帧结构
      • 1.1、帧起始(SOF)
      • 1.2、优先级(P)
      • 1.3、扩展数据页EDP(R)
      • 1.4、数据页(DP)
      • 1.5、替换远程请求Substitute Remote Request (SRR)
      • 1.6、标识符扩展位(IDE)
      • 1.7、PDU格式(PF)
      • 1.8、PDU特定域(PS)
      • 1.9、目标地址(DA)
      • 1.10、组扩展(GE)
      • 1.11、源地址(SA)
      • 1.12、远程传输请求位(Remote Transmission Request ,RTR)
      • 1.13、控制段
      • 1.14、CRC段
      • 1.15、ACK段
      • 1.16、帧结束
      • 1.17、参数组编号(PGN)
      • 1.18、怀疑参数编号(SPN)
    • 2、Protocol Data Unit (PDU) Formats 协议数据单元格式
      • 2.1、PDU1
      • 2.2、PDU2
      • 2.3、PDU总结
  • 三、举栗子
      • 3.1、选择DBC文件的报文
      • 3.2、按位解析
      • 3.3、查询文档
  • 总结


前言

最近刚接触重型卡车的项目,所使用的是J1939协议以及OSEK网络,于是就顺便记录些笔记分享出来,欢迎指点哈~

J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。
该标准主要用于卡车、公共汽车和移动液压等重型车辆
在这里插入图片描述

物理层(J1939/11) 描述了针对客车的电气接口。
数据链路层(J1939/21) 描述了构建报文、访问总线以及诊断传送故障的规则。
应用层(J1939/71和J1939/73) 定义了在网络中传送的每条报文的具体数据,包括PGN以及SPN详情内容解释等。

在这里插入图片描述

话不多说,走你~

一、SAE J1939物理层

SAE J1939的物理层描述了电气接口和物理介质,没啥精髓。定义的内容包括:
1. 物理介质为屏蔽双绞线;
2. 传输速率为250Kbps;
3. 同一网络上最大子系统数为30个;
4. 最大传输线长度为40m;
5. 物理层还定义了数据的物理特性及总线的电气连接特性。

二、SAE J1939数据链路层

J1939协议的精髓全在这里,那就让我们展开叙述。

SAE J1939以CAN2.0B为基础,通过CAN总线进行数据通信。并且拥有18位扩展标识符共29位标识符(CAN 2.0B);
它的数据链路层定义了信息帧的数据结构、编码规则,包括通信优先权、传输方式、通信要求、总线仲裁、错误检测及处理
它负责将CAN扩展帧的29位标识符重新分组定义,使报文的标识符就能够描述报文的全部特征,包括目标地址、源地址等内容。

1、帧结构

“CAN 2.0B”包括两种消息格式的规范,标准帧和扩展帧。
“CAN 2.0B”的兼容性意味着通过使用不同的帧格式位码,保证二者能同时在同一网络中使用。

就此而言, SAE J1939也能够自适应这两种CAN数据帧格式。但是, SAE J1939只使用扩展帧格式全面定义了标准化的通信。所有标准帧格式消息都按照规则作为专用消息使用。因此, SAE J1939设备必须使用扩展帧格式。标准帧格式消息可以在网络中存在,但只能以规定的方式运行。
在这里插入图片描述

1.1、帧起始(SOF)

占1bit,SOF信号只有一个数据位,是一个显性电平(逻辑0),它用于通知各个节点将有数据传输,
其他节点通过帧起始信号的电平跳变沿来进行硬同步。
(这一点和CAN保持一致)

1.2、优先级(P)

占3bit,根据CAN2.0B 的仲裁机制,ID越小优先级越高,按照J1939协议的划分,优先级在整个ID的最前面,实际上依然控制着ID大小,即CAN报文的优先级。
只不过在J1939协议中优先级仅仅用于优化发送数据时的报文延迟,接收报文时则完全忽略优先级。 J1939中的优先级可以从最高的0(000b)到最低优先级7(111b)。
默认情况下控制类报文的优先级为3,其他报文的优先级为6。 当分配新的PGN或总线上流量改变时,允许提高或者降低优先级。

1.3、扩展数据页EDP(R)

占1bit,扩展数据页(EDP)联合数据页(DP)可以决定CAN报文帧中CAN ID的结构,目前为保留位,均设置为0。

1.4、数据页(DP)

占1bit,用于联合扩展数据页EDP来决定CAN ID结构,当EDP为0时,DP为0或者1分别表示第0页或者第1页PGN。如下图所示:
在这里插入图片描述

1.5、替换远程请求Substitute Remote Request (SRR)

占1bit,只存在于扩展帧格式,扩展帧中的SRR位为隐性位(隐性电平(逻辑1))

1.6、标识符扩展位(IDE)

占1bit,当IDE为0时,表示标准格式帧;当IDE为1时,表示扩展格式帧。
(这一点和CAN保持一致)

1.7、PDU格式(PF)

占8bit,PF用来确定PDU的格式,两种格式计算得到PGN的方式不同,我们在下面介绍这两种计算方式。

1.8、PDU特定域(PS)

占8bit,PS的定义取决于PF, 它可能表示目标地址( Destination Address, DA),可能表示组扩展(Group Extension,GE),
如果PF < 0xF0则表示为DA,否则表示为GE。
在这里插入图片描述

1.9、目标地址(DA)

占8bit,DA是报文的目标地址,除目标地址的设备外,其他设备应该忽略此报文。
如果目标地址为0xFF,则表示为全局地址,此时所有设备都应该监听此报文并在收到报文后做出响应。

1.10、组扩展(GE)

组扩展与PDU 格式域的低四位(注意:当PDU 格式域最高四位被置1,说明PS 域是组扩展)规定了每个数据页4096 个参数组。
这4096个参数组仅使用PDU2格式可用。此外,在每个数据页中提供了240个参数组,仅供PDU1格式使用。总共有8672个参数组可以使用当前可用的两个数据页面来定义。
可用参数组总数的计算公式1如下:
在这里插入图片描述

1.11、源地址(SA)

占8bit,发送报文的设备的地址,网络上只能有一个具有给定源地址的设备。因此,源地址根据CAN的要求,字段确保CAN标识符是唯一的。地址管理和分配情况详见SAE J1939-81。在SAE J1939-81中定义了程序,以防止源地址的重复。有关源地址分配,请参考SAE J1939附录B,表B2至表B9。

1.12、远程传输请求位(Remote Transmission Request ,RTR)

当RTR=逻辑0时,表示数据帧;=逻辑1时,表示遥控帧。在 SAE J1939 中始终设置一个显性的 0。
(这一点和CAN保持一致)

1.13、控制段

在控制段中的r1和r0为保留位,默认设置为显性位。它最重要的是DLC段(Data Length Code),数据长度码,
它由四个bit组成,用于表示本报文中的数据段含多少个字节,DLC段表示的数字是0~8 (因为数据段的大小是0到8字节大小)。
(这一点和CAN保持一致)

1.14、CRC段

为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码和接收到的CRC码不同,则它会向发送节点反馈错误信息,利用错误帧请求它重新发送报文。
CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。 在CRC校验码之后,有一个CRC界定符,它是隐性位,主要是把CRC校验码与后面的ACK段间隔开。
(这一点和CAN保持一致)

1.15、ACK段

占2bit,ACK段包括一个ACK槽位和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以应答。在ACK槽和帧结束之间由ACK界定符间隔开。
(这一点和CAN保持一致)

1.16、帧结束

占7bit,由发送节点发送的7个隐性位(逻辑1)表示结束。
(这一点和CAN保持一致)

1.17、参数组编号(PGN)

是 J1939 标准中的唯一帧标识符,用于引用将保留位®、数据页(DP)、PDU格式(PF)和 PDU特定字段(PS)的值组合成单个 18 位值。
参数组还包含了每个报文的 8 字节 CAN 数据字段中的参数分配、重复率和优先级。PGN是J1939标准中唯一的帧标识符(J1939-71文档中列出了PGN以及SPN)。
参数组编号 可分为两种类型:
a)全局参数组编号
此类PGN识别广播(发送给所有人)的参数组。这里,PDU格式(PF) >= 240,并且PDU特定字段(PS)是组扩展。
b)特定参数组编号
这些用于对等发送(到特定设备)的参数组。如果PDU格式(PF) <= 239,并且PDU特定字段(PS)设置为0,则无论两个 PGN 的类型如何, PDU 格式、PDU 特定字段、数据页和扩展数据页都用于识别相应的参数组。

Tips: 如有不明白,看最后的例子即可。

1.18、怀疑参数编号(SPN)

J1939中的SPN作为数据库中包含的CAN信号(参数)的标识符,SPN按照PGN来分组,可以根据其位起始位置、位长度、精度(比例)、偏移量和单位(将SPN数据提取和缩放为物理值所需的信息或者量)来描述。
在这里插入图片描述

在这里插入图片描述

2、Protocol Data Unit (PDU) Formats 协议数据单元格式

定义了两种PDU格式:
PDU1格式(PS =目标地址)和PDU2格式(PS =组扩展),PDU1格式允许将CAN数据帧定向到一个特定的目标地址(设备);
PDU2格式只能通信不特定于目标的can数据帧。

建立了两种单独的PDU格式,是为了提供更多可能的参数组号组合,同时仍然提供特定于目的地的通信。已分配了专有参数组定义,以便这两种PDU格式都可用于专有通信。为专有通信建立了一种标准化的方法,以防止在标识符使用中可能出现的冲突。
在这里插入图片描述

2.1、PDU1

此格式允许将适用的参数组发送到特定的或全局目标。PDU特定字段包含一个目标地址。PDU1格式消息可以被请求或发送。
PDU1格式消息由PF字段确定。当PF字段值为0到239时,消息为PDU1格式。PDU1消息的格式如上图所示。另请参见下图,PDU1格式。
在这里插入图片描述

2.2、PDU2

此格式只能用于将参数组作为全局消息进行通信。PDU2格式消息可以被请求或发送。
在分配PGN时选择PDU2格式,防止PGN无法被定向到特定的目的地。PDU特定项包含一个组扩展。
在这里插入图片描述

2.3、PDU总结

(1) PDU1和PDU2格式下PGN的总数为:( 240+(16*256))*2 = 8672

(2) PDU1格式主要分配给必须指明目标地址的PGNs,数量有限;PDU2格式下的PGNs不能用于必须指明目标地址的情况。大部分PGNs都定义在PDU2段。

(3) 为了保证实时性,报文更新速率小于100ms时不允许多包发送。

(4) PDU1和PDU2格式下均支持单包报文和多包报文。无论是PDU1还是PDU2格式,其前半段PGNs标识的报文更新速率小于100ms,不允许多包发送;后前半段PGNs标识的报文更新速率大于100ms,允许多包发送。

(5) 目前支持五种类型消息,分别为:命令、请求、广播/响应、确认和群扩展。特定消息类型由其分配的参数群编号识别。
RTR位(在CAN协议远程帧中定义)不可用于隐性状 态 ( 逻 辑 1 ) 。
因 此 , 远 程 传 输 请 求( RTR=1)在SAE J1939中不适用。

三、举栗子

3.1、选择DBC文件的报文

在这里插入图片描述

3.2、按位解析

对ID:0xCF00400进行按位解析。
在这里插入图片描述
优先级P: 3
扩展数据页EDR(R):0
数据页DP: 0
PDU格式PF: 0xF0,表示PDU格式为PDU2,即PS表示组扩展
PDU特定域PS: 0x04(应该无指定意义,只为了构成PGN的编号),PS表示组扩展
源地址SA: 此处是0x00,实际发送节点EMS的设备地址是0xFE(有点小疑惑,先不管它)
在这里插入图片描述
参数组编号PGN: 0xF004

3.3、查询文档

步骤一, 在SAE-J1939-21中查询PGN,如下图,发现竟然里面的描述和我们上面按位解析的一致**(说明以后我们第一步先找PGN)**
在这里插入图片描述

步骤二, 继续查询并分析SPN190,所谓SPN我认为就是对数据域做了解析。(下图DBC告诉我们该信号处于4-5byte,SPN为190)
在这里插入图片描述
步骤三, 解析SPN190,如下图。
(和DBC的信号属性对比之后,发现分辨率略有区别。无需纠结,可能是整车厂定义了这个参数。但是具体信号的其他属性均和文档一致)
在这里插入图片描述
在这里插入图片描述

总结

关于PGN查询,我在博客下载过一个表格,里面对PGN和SPN等做了链接关系及属性
链接地址
如果哪里表达的有问题,还请大佬们指点指点哈。只算是个人笔记,有些内容和图片非原创。

这篇关于SAE-J1939协议入门解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437885

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库