新闻详情

新闻详情

首页 / 资讯中心 / 详情

新功能发布—TSMaster如何实现J1939多帧报文收发

发布时间:2026/9/29 2:11:05来源:尧图网络
新功能发布—TSMaster如何实现J1939多帧报文收发
前言众所周知J1939协议是由美国汽车工程师协会SAE定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。如今大多数车辆都通过CAN进行ECU通信。但是CAN总线仅仅是提供了通信的基础就像是电话但是没有提供对话的“语言”来进行更复杂的操作。所以在大多数大型车辆中这个“语言”就是SAE定义的J1939标准。今天我们继续来介绍TSMaster新功能—J1939多帧报文收发。这个功能属于J1939的高级功能需要license的授权具体操作需求可以联系我们。一、J1939功能使用我们假设已经拥有了带license的硬件以TC1005为例选择硬件通道后连接应用程序随后打开about窗口就可以看到拥有license的列表。其中有一个J1939的option接下来介绍这个功能的使用。 首先打开TSMaster的安装目录进入demo文件夹找到示例数据库J1939ILDemo的数据库文件。我们将其拖入TSMaster中这个拖入的过程需要在程序断开连接的时候来完成可以看到这个数据库里面有四帧报文它的PGN分别为EF00EF00FF02和FF01。 其中前两帧为点对点的多帧分别是节点2往1发1往2发后两个是广播分别是地址2的广播和地址1的广播。以第一帧为例他的DLC35个字节这意味着这个信号可以在这35乘以8也就是280个位置里面任意排布。那么报文中的sgn1~4就是模拟了这种情况。如果希望发送这些报文我们可以直接使用发送窗口我们打开CAN Transmit窗口点击左上角的来自数据库的按钮选择刚才看到的四帧报文然后再将视图切换成J1939这样协议相关的信息就一览无余了。前两个是点对点后两个是广播可以从目的地址看出来对于广播报文来讲发送节点只要自顾自的发送就可以了。而对于前两个点对点的发送过程不但需要发送节点还需要接收节点在过程中进行应答才能完成整个发送过程。所以我们还需要激活TSMaster内置的J1939的仿真节点。 接下来我们来到仿真J1939的仿真配置对话框里面可以看到节点1和2分别被标注为Node1和Node2所有的节点都勾选了仿真发送功能但是仿真接收功能默认是没有勾选的。我们可以通过激活rbs的方法来自动激活这两个接收的功能同时呢也可以手动勾上在此我们就手动勾选并且点击应用设置来关闭对话框。 这个时候就可以启动仿真了我们按下F5然后打开trace窗口随后呢我们激活这4个节点的这4个报文的发送就依次点击发送就可以了。于是在右侧的trace窗口中间就可以看到这4个多帧报文的接收情况。他们的DLC分别是右边的353613和33然后右边显示的就是他们的默认的数据段默认都是0。 我们当然可以修改他们的数据字节来任意的修改他们的数据那这里就可以看到这是我们刚才修改的结果我们当然还可以通过信号生成器的方式来改比如说我们选中第一帧报文在这个sgn1 a2上面选择正弦然后点击配置我们可以把峰值改的稍微大一点然后点击应用、点击启动这个时候就可以看到这个sgn1 a2就在发生变化。 接下来可以打开图形窗口将这个信号拖进来就可以看到正弦波当然这个正弦波的频率比较低这是因为它是多帧它发一帧需要200毫秒所以一秒只有5个点我们还可以通过其他的窗口来进行观察比如说数值显示。 最后我们打开数值显示点击这里的添加按钮可以选择我们的信号当然我们也可以通过拖动的方式将信号拖进去之后可以调整窗口的大小使得信号值可以在上面显示。我们还可以通过面板的方式添加当然面板需要设计所以首先需要停止仿真停止仿真之后我们可以将信号拖入面板再启动仿真然后再启动报文的发送这样就可以看到这些信号都可以在测量窗口里面正确的显示。二、J1939一系列API函数J1939有一套API的函数通过这一套API就可以实现J1939的信号读写、报文发送等等一系列功能。 我们打开一个自动化模块然后选中入口点按回车增加一系列的动作。我们选第一个动作然后设置他为API函数调用在过滤器里面敲入1939就可以看到1939的一系列API。这其中有1939的标识符的get和set方法以及下面的多帧报文的发送方法。关于标识符的get和set方法在此就不展开描述大家完全可以查看c代码编辑器里面的小程序的帮助文档里面有详细的介绍在右侧也可以看到示例代码。那么这次我们着重介绍一下1939的多帧发送的API。 首先我们可以选中1939异步发送API那么发送分为同步和异步两种同步意味着发完之后程序才会往下走异步则意味着只要将数据推入发送缓存程序就可以继续往下那么不管是同步还是异步还分了两种类型。一种是不带字符串的发送一种是基于字符串的发送。那么基于字符串方式的发送他的数据是以逗号来进行分隔那么这两种方式自动化模块都是支持的。因为在自动化模块里面数组均以逗号分隔的字符串表达那么我们可以选择一个异步发送函数就可以看到这个函数有7个输入的参数。 那么第一个参数是通道号我们可以选择常量比如说channel1然后PGN在此我们就可以输入。比如说我们可以选广播就是刚才看到的OxFF01然后优先级是6默认源地址是2目的地址是1然后PDU的数据我们可以随意填写。比如说Ox11然后我们可以将这个复制多份密贴多份这里长度是可以很长。他的实际长度是被最后一个参数限制那么在此我们可以保持跟dbc的一致也就是35然后我们就可以启动按F9启动发送或者点击发送按钮那么就可以发送成功。 我们就可以看到trace窗口里面显示的发送的信号内容跟我们的设置是一模一样最后如果说数据不够就会以0来补充。那么我们可以把数据填多一点再启动发送这样的话数据长度就会正好达到我们的所需要的长度。那这是原始报文的发送方法倘若需要修改报文里面的信号的值就需要rbs的仿真引擎来支持那我们可以点击CAN总线仿真窗口来模拟节点的行为我们激活这两个节点然后将总线仿真设置为自动启动这个时候可以看到rbs已经在工作了并且得到了我们通过发送窗口一样的结果。 当然发送窗口这个时候是不应该启动发送回到自动化模块里面删除我们的原始的报文发送的动作设置一个新的动作衍生函数调用在此我们搜索set Signal by address通过这个函数就可以实现rbs里面信号的任意修改。那这里有两个参数分别是信号地址和值那么信号地址就是我们所需要发送的信号的数据库地址我们可以随便选一个比如说A_Node1 signal 1_a1我们可以点击复制数据库地址然后到这里粘贴即可然后他的值我们可以随意修改然后我们可以点击启动那么这样就实现了这个信号的修改可以看到A_Node1里面的这个信号已经变成1111就是我们所设置的值那么这就是信号的发送。如果是希望接收一个信号的值该怎么做呢我们可以用到signal server的方法还是来到函数调用删除我们刚才的发送然后再多加几个动作。我们首先将它改为函数调用然后输入SGN SRV这就是signal server的系列函数。 那这里需要一个流程首先需要注册我们关心的信号需要用到register_can_signal_by_message ID或者是name我们在这里选择message ID那么我们就需要到rbs里面去copy这个报文的IDcopy过来的时候需要把后面的x删掉让这个字符串是一个有效的16进制值通道还是可以用之前的通道1然后信号名称就是我们关心的信号。 比如说sgn1_a1我们自己直接输入sgn1_a1client ID是这个函数注册成功之后给到我们程序的一个handle我们可以新建个变量来存储它就命名ID就行。这个时候直接已经可以点击本地变量关联我们的ID然后我们可以等一会再读取信号的值那这个时候可以调用wait函数比如说等个3秒然后接下去就是一个读取过程同样用到了Signal server sgnsrv get_can_signal物理值。最后通过这个方法去取得得到的信号的物理值那么在这里可以同样选择channel1 client ID就填我们刚才所得到的变量ID然后这里就是输出的值我们同样可以用一个变量来装这里需要添加的就是个double型的变量value写个v就行然后在这个地方选择v然后同时还会返回最后的时间戳如果不需要的话我们这里默认填个0就行或者不填。 然后这个时候我们可以将我们读到的值打印出来这时候就需要用到log函数字符串我们可以写我们的变量v的值作为字符串那么log level可以用一种颜色比如说绿色然后我们点击启动这个时候首先获取ID等待然后最后获取值结束那么我们会看一下每一步骤的运行结果。在这里都有反馈这里是实际传入的参数值wait然后读到的参数值然后我们可以看一下打印出来值就是111就是我们之前设定的值那么我们完全可以改一下这个值比如说改成12345这个值最大就是2047我们就设它为2047这个时候我们只要再启动一下程序我们打开log就可以看到我们获取的值跟我们设定值是一样。这就是1939系列API的用法。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Gram-Schmidt正交化数值稳定性深度解析:从CGS到MGS与Householder 2026/9/29 6:58:18

Gram-Schmidt正交化数值稳定性深度解析:从CGS到MGS与Householder

写这篇Gram-Schmidt正交化笔记,起因是上周帮一位做点云配准的朋友排查程序异常。他从激光扫描数据里提取了一组近似线性相关的测量向量,想恢复出坐标系的三个标准正交基——这是Gram-Schmidt正交化最典型的应用场景。结果他直接套了网上最常见的经典算法…

阅读更多 →
KubeVela workflow 中的 step-group 步骤:用 subSteps 并行编排子步骤 2026/9/29 6:58:18

KubeVela workflow 中的 step-group 步骤:用 subSteps 并行编排子步骤

云原生DevOps运维微服务 【免费下载链接】kubevela The Modern Application Platform. 项目地址: https://gitcode.com/gh_mirrors/ku/kubevela 点击查看 免费下载 KubeVela 的应用工作流(workflow)支持以 step-group 这一特殊内置步骤&…

阅读更多 →
手搓UDS Bootloader|全网独家复现0x31例程控制、解析Flash分页擦除与0x78长耗时响应、助力ECU固件预擦除、车载OTA升级、产线刷写稳定落地 2026/9/29 6:58:18

手搓UDS Bootloader|全网独家复现0x31例程控制、解析Flash分页擦除与0x78长耗时响应、助力ECU固件预擦除、车载OTA升级、产线刷写稳定落地

目录 一、前言 二、0x31例程控制服务核心体系与原理 2.1 服务核心定位与量产应用场景 2.2 Flash硬件擦除底层核心机制 2.3 协议强制约束与超时规范 2.4 0x31服务子功能与例程规则 三、0x31标准报文与NRC错误码全解析 3.1 完整交互报文格式 3.2 量产高频NRC否定响应码 …

阅读更多 →
基于SSM+JSP的酒店管理系统:从架构设计到部署实战 2026/9/29 6:58:18

基于SSM+JSP的酒店管理系统:从架构设计到部署实战

直接聊重点:Java基于SSMJSP的酒店管理系统,算得上Java Web课程设计和毕业设计的“钉子户”题目。但凡接触过Java Web,大概率绕不开这套经典组合,SSM负责后端骨架,JSP负责页面展示,把酒店管理里的房型、客房…

阅读更多 →
C语言结构体内存对齐与sizeof计算实战解析 2026/9/29 6:58:18

C语言结构体内存对齐与sizeof计算实战解析

结构体这三个字,写过 C 或者 C 的人都不陌生,可真要回答“这个结构体占多少字节”“为什么调换两个成员顺序之后 sizeof 就变了”这类问题,能一口答上来的人并不多。我见过不少写了三四年嵌入式代码的人,遇到结构体在内存中的存储…

阅读更多 →
Cursor 2.4 配置 TaoToken:Subagents 与 Skills 的 settings.json 骨架 2026/9/29 6:58:11

Cursor 2.4 配置 TaoToken:Subagents 与 Skills 的 settings.json 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉