J1939 入门教程

article/2025/10/19 11:05:06

SAE J1939协议是基于CAN2.0B协议之上的应用层协议,但是SAE J1939协议并不仅仅是个应用层协议,她对物理层,数据链路层,网络层,应用层,故障诊断, 网络层管理层等都做了详细的规定,只不过这其中很多规定都跟CAN2.0B一致。我们这里只介绍J1939的应用层,对软件开发来说已经足够。 对熟悉CAN2.0B协议的小伙伴来说,其实只要掌握下面几个关键点,J1939就瞬间不再神秘。

  • J1939协议是基于CAN2.0B的应用层协议,所有J1939报文都是使用29位标志符。

CAN报文中我们有11位标志符的标准帧也有29位标志符的扩展帧,在J1939协议中,我们所有报文都是29位标志符, 数据域则跟CAN报文的数据没有区别。

  • CAN报文是基于ID的,而J1939协议是基于PGN的

这一点几乎就是J1939协议的全部内容。CAN2.0B使用29位的标志符来区分不同的报文,J1939对这29标志符进行了重新的分类和解释。打个不是很恰当的比方, 以前CAN2.0B协议根据人的体重来区分不同的人,只要一样重(ID)就认为是相同的人群,体重越瘦的就越是受CAN2.0B协议喜欢(优先级越高),现在J1939也是测量体重, 只不过是把人的脑袋,躯干,双手,双腿分别测量,然后对这几个重量进行某种运算(比如脑袋重量的平方,躯干重量与双手重量乘积,以及双腿重量这三个数字之和), 只要运算的结果(PGN)一致,就认为这些人是一个人群。

也就是说,J1939对CAN2.0B中的29位标志进行了重新解释,我们使用下面这张图来说明一下:

J1939对CAN ID进行了重新划分,加上最多8个字节的数据域,构成了J1939 的协议数据单元(Protocol Data Unit, PDU),其中前3位表示优先级位(Priority, P), 之后是扩展数据页位(Extended Data Page, EDP),数据页位(Data Page,DP), PDU格式位(PDU Format, PF), PDU特定域位(PDU Specific, PS), 源地址位(Source Address,SA) 以及数据域(Data Filed)。

J1939的协议数据单元与CAN 报文帧相比要少一部分,比如SOF, SRR, IDE等,这是因为这部分完全由CAN 2.0B控制,J1939并未对这部分做任何修改。 J1939与CAN报文帧的对比可参考下图:

如上图所示,J1939重新划分了29位的CAN ID,中间18位共同组成了参数组编号(Parameter Group Number, PGN),在CAN 报文中,我们根据CAN ID来区分不同报文,在J1939中, 我们根据PGN来区分不同的报文。J1939-71中对不同的PGN做了一系列详细的规定,不同的PGN来表示不同的数据或者功能。J1939-71对PGN的规定非常详细,足足有六百多页, 对于用户来说,可能熟悉自己常用的一些PGN就足够了,具体需要某些功能时去查询就好了。

总结一下就是,J1939跟CAN 2.0B不同的地方就在于,J1939是以PGN为中心,通过不同的PGN来区分不同的类型,比如有些PGN传输控制命令,有些PGN传输数据, 有些传输请求,有些传输响应等等。在使用CAN传输数据时,CAN协议往往是我们自己定义的, 而J1939-71中对不同的PGN做了详细的规定,相当于已经帮我们做好了协议。当然实际情况中我们也可以自定义PGN。理解了这些后,学习J1939就会变得很简单, 之后再对J1939的细节做一些介绍。

J1939 PDU各部分介绍

下面分别对协议数据单元的几个部分做简单介绍:

  • 优先级(P)

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

  • 扩展数据页(Extended Data Page, EDP,保留位)

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

  • 数据页(Data Page,DP)

用于联合扩展数据页来决定CAN ID结构,当EDP为0时,DP为0或者1分别表示第0页或者第1页PGN。如下图所示:

  • PDU格式(PF)

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

  • PDU特定域(PS)

PS的定义取决于PF, 它可能表示目标地址(Source Address, SA),可能表示组扩展(Group Extension,GE), 如果PF < 0xF0则表示为DA,否则表示为GE。如下图所示:

  • 目标地址(DA)

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

PGN 计算方法

有了上面的概念后我们再介绍一下PGN的计算方法,PGN的计算方法其实非常简单,用下面的公式即可:

if (PF < 0xF0){PGN = (DP << 9) + (PF << 8);
}else{PGN = (DP << 9) + (PF << 8) + PS;
}

让我们来计算一下两种PF下各有多少个PGN,对于PF < 0xF0的情况,PGN数目应该等于 2 * 0xF0 = 480, 对于PF >= 0xF0的情况, PGN数目应等于2 * 16 * 256 = 8192, 所以两种情况PGN总数应为480 + 8192 = 8672

多帧传输机制

当传输的数据大于8个字节时,无法通过一帧CAN报文来装载,此时就需要使用多帧传输。J1939多帧传输的规则很简单,就是把数据域的第一个字节拿出来当作编号, 这样原来每帧CAN报文最多可传输8个字节内容,由于现在被编号占用了1个字节,只能传输7个字节。由于编号范围为1-255,所以多帧传输的最大数据长度是255 * 7 = 1785个。 需要注意,最后一帧报文实际需要传输的内容可能不足7字节,比如一共要传输9个字节,第一帧CAN报文传输了7个字节,第二帧CAN报文只能传输2个字节, 这样加上1个编号字节,还剩5个字节,这5个字节要全部设置为0xFF。发送数据时,按照编号把数据拆装成多帧报文,接收数据时,则按照编号重新组装成完整的数据。

可疑参数编号(Suspect Parameter Number,SPN)

SPN是指数据域中的某个参数,J1939-71不仅对PGN做了详细的规定,对SPN也做了详细的规定,并对每个参数做了编号。通过下面的例子可能更好理解一些。

PGN 与 SPN 的例子

我们以PGN65213为例(为什么用这个例子?为什么其他博客也用这个例子?因为J1939-71里面就是用的这个例子)。J1939-71中PGN65213的例子如下:

这表示PGN65213只用了4个字节,其中第1个参数Estimated Percent Fan Speed占用1个byte,起始位为第1个字节,SPN为975。 第二个参数Fan Drive State 占用了第2个字节的前4位, SPN 为977, 第3个参数Fan Speed占用2个字节,SPN为1639。 目前我们只知道这三个参数每个参数存储的位置,长度,但是并不知道每个参数的分辨率, 偏移量,范围等信息,要知道具体每个参数的详细规定,需要查看具体SPN的规定。 三个SPN的规定都能在J1939-71中找到,如下所示:

根据SPN975的内容,如果风扇估计的百分比转速为50%, 由于分辨率为 0.4%/bit, 偏移量为0,则这个字节的数值应为 40% / 0.4% = 100 = 0x64

根据SPN977, 如果风扇当前因油温过高而运转,则风扇驱动状态为3。

根据SPN1639, 如果风扇当前转速为1500 rpm,由于分辨率为 0.125 rpm/bit,偏移量为0, 则这两个字节的数值应为: 1500 / 0.125 = 12000 = 0x2EE0

在上面假设都成立的情况下,我们进一步假设ECU地址为0x9C, 优先级为默认值6, 且此ECU需要往VCU发送PGN65213(0xFEBD) PGN65213在J1939-71中的详细描述如下图:

根据定义,EDP = 0, DP = 0, PF = 0xFE, PS = 0xBD, 由于ECU地址为0x9C,则CAN报文ID为 0x18FEBD9C, 数据域Byte1 = 0x64, Byte2 = 0xF3, Byte3 = 0xE0, Byte4 = 0x2E, Byte5 = Byte6 = Byte7 = Byte8 = 0xFF。

 

 

原文地址:J1939入门教程


http://chatgpt.dhexx.cn/article/5a3TCKv8.shtml

相关文章

神经网络炒股出现的问题,炒股容易得神经病吗

听朋友说他用盈首AI全自动炒股机器人炒股&#xff0c;效果很好&#xff0c;请问一下用过的朋友&#xff0c;不知道是否是真的&#xff1f; 应该是真的&#xff0c;现在是人工智能时代&#xff0c;科学炒股是必然选择&#xff0c;国家也在出了很多支持人工智能的政策&#xff0…

竟然可以用python炒股?

由于笔者并无深厚的数学功底也无深厚的金融知识, 所以不会在本文中引用各种高深的投资模型或数学模型&#xff0c;参考书籍主要是《海龟交易法则》《以交易为生》。 交易系统 在交易之前&#xff0c;我们应该首先有一个交易系统用于指导我们自己交易&#xff0c;不一定有什么规…

用深度学习算法预测未来股票走势

最近研究了一下用深度学习算法来预测股票未来的走势&#xff0c;看了网上不少别人分享的案例&#xff0c;也实际进行了测试&#xff0c;感觉用 LSTM 算法比较适用。长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#…

AI in Finance<量化交易人工智能金融投资>(下)

7 机器学习量化策略7.1 基于股价涨跌分类/回归模型7.1.1 特征选择(遗传算法因子挖掘)7.1.2 Linear Regression股价回归预测7.1.3 Logestic Regression涨跌分类预测7.1.4 Random Forests涨跌分类预测7.1.5 SVM涨跌分类/回归预测7.1.6 MLP涨跌分类/回归预测7.1.7 集成学习 涨跌分…

(转)人工智能无处不在,这次是有公司用它来炒股

这事情能成吗&#xff1f; 人工智能是现在科技界一个比较热门的话题&#xff0c;不管公司大小、做什么&#xff0c;都在谈人工智能&#xff0c;好像这是唯一的选择。 现在有人想用它来炒股。 Shaunak Khire 的团队开发了一套机器智能系统 Emma AI&#xff0c;正在募资成立一…

AI 量化机器人,人工智能如何助你从股市发家?

量化交易是不是很高大上&#xff1f; 量化交易&#xff0c;听起来很高大上&#xff0c;其实就是众多投资方法中的一种。 要理解什么是量化交易&#xff0c;首先我们来说说什么叫“量化”。 我们来想象一种场景&#xff1a; 假如有人做了两道菜&#xff0c;让大家去评价这两道菜…

如何用深度强化学习自动炒股

向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习 公众号&#xff1a;datayx 深度学习技术在股票交易上的应用研究调查 http://gregharris.info/a-survey-of-deep-learning-techniques-applied-to-trading/ 文中缩写&#xff1a; DBN 深度信…

如何用人工智能预测股票(完整项目)

本文由 沈庆阳 所有,转载请与作者取得联系! 前言 十分钟实现人工智能股价预测&#xff0c;是一个深度学习的练习项目。其通过机器学习算法&#xff0c;根据过去几年与某只股票相关的K线走势、公司相关报道的情感分析作为数据集&#xff0c;通过训练来得到可以预测股价的机器学…

想靠AI炒股致富,结果恐怕会让你怀疑人生

来源&#xff1a;脑极体 作者&#xff1a;藏狐 经历了漫长熊市的A股&#xff0c;在农历新年后迎来了一个超乎想象的春天。最能够代表牛市来临的信号&#xff0c;不是领跑全球的历史性涨幅&#xff0c;而是连你老家的大妈都准备拿出首付甚至卖房抄底了&#xff0c;各路股神纷纷出…

手把手带你玩转Spark机器学习-使用Spark进行文本处理

系列文章目录 手把手带你玩转Spark机器学习-专栏介绍手把手带你玩转Spark机器学习-问题汇总手把手带你玩转Spark机器学习-Spark的安装及使用手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换手把手带你玩转Spark机器学习-使用Spark构建分类模型手把手带你玩转Spa…

大数据笔记--Spark机器学习(第二篇)

目录 一、梯度下降法 1、什么是梯度&#xff1f; 2、梯度下降法与梯度上升法 3、梯度下降法的直观解释 4、梯度下降法的相关概念 5、梯度下降法原理 6、梯度下降法的算法参数 7、梯度下降法-家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09; 8、总结 …

Spark机器学习(一)-Spark工程搭建

目录 概述 环境准备 搭建Spark项目的代码工程 创建maven项目工程 创建scala测试类 整合spark环境 概述 最近自己在加强AI这块&#xff0c;以前做Java、大数据分析比较多&#xff0c;所以对CDH那套东西都比较熟悉&#xff0c;例如Hadoop、Spark。但Spark这块中的ML用得不…

【Spark】实验6 Spark机器学习库MLlib编程实践

Spark机器学习库MLlib编程实践 一、实验目的 通过实验掌握基本的MLLib编程方法&#xff1b;掌握用MLLib解决一些常见的数据分析问题&#xff0c;包括数据导入、成分分析和分类和预测等。 二、实验平台 新工科智慧平台。数据集1&#xff1a;下载Adult数据集(http://archive.i…

手把手带你玩转Spark机器学习-使用Spark进行数据降维

系列文章目录 手把手带你玩转Spark机器学习-专栏介绍手把手带你玩转Spark机器学习-问题汇总手把手带你玩转Spark机器学习-Spark的安装及使用手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换手把手带你玩转Spark机器学习-使用Spark构建分类模型手把手带你玩转Spa…

spark之常见的机器学习算法

1、分类、回归、聚类 分类回归是一种重要的机器学习和数据挖掘技术。分类的目的是根据数据集的特点构造一个分类函数或分类模型(也常常称作分类器)&#xff0c;该模型能把未知类别的样本映射到给定类别中的一种技术。 即&#xff1a; 向量X[x1,x2...xn]但标签C[c1,c2...,ck]的…

Apache Spark机器学习

推荐电子书&#xff1a;Apache Spark 2.x入门 - 从入门到制作 前言&#xff1a; 使用Apache Spark 2.0及更高版本&#xff0c;实现了很大的改进&#xff0c;使Spark更容易编程和执行更快&#xff1a; Spark SQL和Dataset / DataFrame API通过Spark SQL优化的执行引擎提供易用…

Spark Machine Learning(SparkML):机器学习(部分二)

目录 6.分类和回归 6.1分类(Classification) 逻辑回归(LR) 决策树分类器(DTC) 随机森林分类器(RFC) 梯度提升树分类器(GBTC) 多层感知器分类器(MLPC) 线性支持向量机(SVM) One-vs-Rest分类器 朴素贝叶斯(NB) 6.2回归(Regression) 线性回归(LR) 广义线性回归(GLR) …

spark机器学习笔记:(六)用Spark Python构建回归模型

声明&#xff1a;版权所有&#xff0c;转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmodecontents 博主简介&#xff1a;风雪夜归子&#xff08;英文名&#xff1a;Allen&#xff09;&#xff0c;机器学习算法攻城狮&#xff0c;喜爱钻研Meachine Learnin…

Spark机器学习实例

2020/07/09 - 引言 《Learning Spark》过程中只是简单介绍了mllib中的东西&#xff0c;没有一个完整的实践过程&#xff0c;暂时还没有去找有没有专门做这种的书&#xff0c;好像我看《spark in action》是有这部分内容&#xff0c;后续在看。本篇文章就利用这个鸢尾花的数据集…

spark机器学习笔记:(一)Spark Python初探

声明&#xff1a;版权所有&#xff0c;转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmodecontents 博主简介&#xff1a;风雪夜归子&#xff08;英文名&#xff1a;Allen&#xff09;&#xff0c;机器学习算法攻城狮&#xff0c;喜爱钻研Meachine Learnin…