SAE J1939协议学习笔记

SAE J1939协议学习笔记引用百度百科:SAEJ1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track&BusElectrical&ElectronicsCommittee)下属的“卡车与大型客车控制和通讯网络附属委员会”(Track&BusContro…

大家好,又见面了,我是你们的朋友全栈君。

引用百度百科:

SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track & Bus Electrical & Electronics Committee)下属的“卡车与大型客车控制和通讯网络附属委员会”(Track & Bus Control and Communications Network Subcommittee)开发编写。

J1939基于德国Bosch公司(Robert Bosch GmbH)开发的控制器局域网络(CAN:Controller Area Network),可达到250Kbps的通讯速率。它描述了重型车辆现场总线的一种网络应用,包括CAN网络物理层定义、数据链路层定义、应用层定义、网络层定义、故障诊断和网络管理。在SAE J1939协议中,不仅仅指定了传输类型、报文结构及其分段、流量检查等,而且报文内容本身也做了精确的定义。目前,J1939是在商用车辆、舰船、轨道机车、农业机械和大型发动机中应用最广泛的应用层协议。

CAN总线原理参考文章:https://blog.csdn.net/tq384998430/article/details/79126597https://www.cnblogs.com/spoorer/p/6649303.html

目前国家开始执行国二升国三标准,据我所知对于柴油机而言国二和国三标准的最大差别就是国三是电喷,国二是传统机械式的,虽然我不是很了解汽车电子行业,但是我知道使用电喷就需要有专门的电子电路进行电喷控制,这个控制设备就是ECU或者叫ECM模块。ECU模块就是一个嵌入式设备用于汽车发动机控制,也可以叫做行车电脑,是控制发动机的核心部件,当然,一辆完整的汽车控制系统了需要ECU之外还有其他控制设备,例如刹车系统、安全气囊、转向系统等等。各个控制设备之间使用CAN总线连接到一个局域网中,CAN总线的优越特性使得其适合汽车行业,并且得到了广泛的使用。

不过汽车网络是很复杂的,虽然都是基于CAN总线协议进行通信但是不同的系统使用的上层协议是有差别的,例如家用汽车使用的协议标准和卡车使用的协议标准是不一样的。国三标准规定柴油机必须遵循SAE J1939协议,SAE J1939是在CAN总线基础上定义的,它的数据链路层规定了CAN总线使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps。这里不讨论SAE J1939协议的物理层,只专注软件层面。

SAE J1939协议将CAN 2.0B的29bit扩展帧标识符进行的分段定义:

SAE J1939协议学习笔记

最高的三位为Priority(优先级)字段。接下来的18位为PGN,PGN由EDP(1bit)、DP(1bit)、PF(8bits)、PS(8bits)组成,剩下的8位为SA(Source Address 源地址)。参考我之前的文章《CAN总线学习①-总线仲裁机制》介绍的CAN总线的仲裁原理,可以知道Priority字段数值越小在仲裁的时候会被优先分配到总线占用权利。我上面说过一个完整的汽车系统不仅仅只有一个ECU模块,还需要有很多其他的控制设备(功能模块),SAE J1939协议将每个控制设备都用一个目标地址来寻址,SA源地址字段正是出于这个目的设计的,各种不同的控制设备的源地址如下表:

标识符

装置

Hex

Dec

 

0x 00

0

发动机控制单元

0x 03

3

传动系统控制单元(变速箱)

0x 0B

11

电控刹车系统 (EBS)

0x 0F

15

发动机缓速器

0x 10

16

驱动系统缓速器

0x 17

23

仪表

0x 21

33

车身

0x 24

36

PTO

0x 27

39

车辆智能中心

0x 29

41

排气缓速器

0x 2B

43

车载诊断系统

0x EE

238

转速表

0x F9

249

故障诊断-售后服务工具

PGN是最重要的一个字段,全称为Parameter Group Number,组成元素包括EDP(Extended Data Page)、DP(Data Page)、PF(PDU Format)、PS(PDU Specific),其中PDU是Protocol Data Unit的简写。我没有深究这些字段的含义,因为我看资料一般都是写PGN:65226之类的,并没有将PGN拆开解释。

SAE J1939协议发送小于等于8字节的报文时使用一个CAN帧就可以,发送长度大于8字节的报文是需要分成多个CAN帧的。这里只讨论数据长度小于等于8字节时的报文。SAE J1939的CAN扩展帧定义:

SAE J1939协议学习笔记

可以看出来SAE J1939协议其实就是在CAN协议的基础上封装了一层,相比较计算机网络的7层协议来说已经简单很多了,可能这就是SAE J1939协议的设计目的,不为了多强大的性能和丰富的功能,只要稳定和速度。

下面以一个SAE J1939的报文ET1为例操刀解析一下。

ET1报文是由发动机的ECU模块以1000ms的周期发送出来的。报文的优先级为6,PGN为0xFEEE,拆开PGN得到EDP和DP都为1,PF为0xFE,PS(DA)为0xEE。报文的SA源地址为0x00,表示报文来自的控制设备为发动机控制单元就是ECU。数据字段的第一个字节为发动机冷却液温度,第二个字节为发动机燃油温度,第三个字节为发动机机油温度,5到8字节未定义。这样如果我们设计的设备通过CAN总线连接到ECU模块上的话会接收到来自ECU的ET1报文,我们将报文的数据解析出来就可以获取到发动的三个重要运行参数了,同理,其他众多的参数也是这样获取到的。

当然了,除了可以读取来自ECU的数据,我们还能够写数据到发动机中去,按照SAE J1939协议设置好CAN帧的优先级、PGN、源地址和数据,发送给ECU即可。

附 缩写表:

SAE J1939协议学习笔记

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135179.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 权威外汇交易平台_国内外汇交易平台排行

    权威外汇交易平台_国内外汇交易平台排行Guardian是世界领先的在线金融商品交易平台,在华经营已超过10年,是专业外汇指数交易商。Guardian以优质的客户服务,技术支持以及同业最出色的交易系统使其成为客户理想的选择对象。Guardian服务对象包括金融机构客户,对冲基金,经理人账户和个人客户,多年来以卓越的信誉赢得了客户的满意。Guardian集团是专注于为全球客户提供包括外汇、贵金属、期权、指数、数字货币等交易产品,以及…

    2025年10月22日
    4
  • java工程师笔试面试题[通俗易懂]

    java工程师笔试面试题[通俗易懂]1.J2EE是什么?它包括哪些技术?解答:从整体上讲,J2EE是使用Java技术开发企业级应用的工业标准,它是Java技术不断适应和促进企业级应用过程中的产物.适用于企业级应用的J2EE,提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是一个标准,而不是一个现成的产品。主要包括以下这些技术:1)Ser

    2022年7月11日
    15
  • 什么是DDR3_DDR3 SDRAM

    什么是DDR3_DDR3 SDRAMODT是什么鬼?为什么要用ODT?在很多关于DDR3的博文和介绍中都没有将清楚。在查阅了很多资料并仔细阅读DDR3的官方标准(JESD79-3A)之后,总算有点了头绪,下面来整理整理。1、首先ODT是什么?ODT(On-DieTermination),是从DDR2SDRAM时代开始新增的功能。其允许用户通过读写MR1寄存器,来控制DDR3SDRAM中内部的终端电阻的连接或者断开。在DDR3…

    2025年10月16日
    2
  • 联合体(union)的使用方法及其本质

    联合体(union)的使用方法及其本质有些基础知识快淡忘了,所以有必要复习一遍,在不借助课本死知识的前提下做些推理判断,温故知新。1.联合体union的基本特性——和struct的同与不同union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的…

    2022年6月2日
    37
  • String与StringBuffer的区别?

    String与StringBuffer的区别?String:1.String创建的对象是不可变的,一旦创建不可改变2.对象值可以改变其实是创建了一个新的对象,然后把新的值保存进去(如图1)3.String类被final修饰,不可以被继承4.String创建的对象的值存在于常量池,不用的时候不会被销毁5.String运行时间较长6.String适用于比较短而小的字符串图1StringBuffer:1.StringBuffer创建的对象是可变的2.它的改变不像String那样重新创建对象,而是通过构造方法(如图2)3.StringBu

    2022年9月21日
    2
  • 盘点当下大热的 7 大 Github 机器学习『创新』项目

    盘点当下大热的 7 大 Github 机器学习『创新』项目本文将会分享近期发布的七大GitHub机器学习项目。这些项目广泛覆盖了机器学习的各个领域,包括自然语言处理(NLP)、计算机视觉、大数据等。最顶尖的Github机器学习项…

    2022年6月7日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号