[实践]利用J1939传输8字节以上的数据(TP长帧传输)

来源:互联网 发布:日常悠哉大王知乎 编辑:程序博客网 时间:2024/09/21 08:17

简介

在J1939源文档中,文件J1939-21(数据链路层)有着这样的规定,数据链路层具有传输长度大于8字节小于1785字节的传输协议,我们对这个传输协议叫做 TP .它将细分为两个功能:消息的拆装和重组,还有连接管理,这个知识可以参考J1939-21源文档学习。下面将阐述对J1939协议栈TP功能的应用示例。

知识假设

  1. 我们已经将最新的J1939协议栈从github上下载,并且成功的移植到我们的芯片J1939协议栈下载
  2. 我们有两个独立运行ECU(电子控制单元),将地址配置为 0XF1 ,0XF4.其他的配置均正确。
  3. 节点为0xf4的为发送者
  4. 节点为0xf1的为接受者
  5. 我们要将数据 data[100] ={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7};的100字节的数据在两个ECU之间传输。
  6. 两节点之间的数据传输的监测,我们采用周立功的CANPro.
  7. 我采用协议栈的轮询模式(移植简单)

测试代码

  1. 发送节点0XF4,TP发送示例

void thread_j1939 (void const *argument){    int _b=1;    char data[100] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7};    J1939_Initialization( TRUE );    // 等待地址声明超时    while (J1939_Flags.WaitingForAddressClaimContention)        J1939_Poll(5);    while(1)    {        if(_b >1000)  //10秒发一次数据        {            _b = 0 ;            /*发送一个长帧 data*/            while(J1939_TP_TX_Message(65259,0XF1,data,sizeof(data))==RC_SUCCESS)              J1939_Poll(5);        }        _b++;        osDelay(10);    //10毫秒的延时        J1939_Poll(20);    }}   

可以将thread_j1939 ()理解为 main(),这里使用的RTOS实时操作系统,CAN的初始化已在其他的线程里实现

  1. 接受节点0XF1,TP接受示例

void thread_CANComm (void const *argument){    char data[100];    J1939_Initialization( TRUE );    // 等待地址声明超时    while (J1939_Flags.WaitingForAddressClaimContention)          J1939_Poll(5);    //地址已经声明好(设备已挂载到总线上)    while(1)    {         /*读取TP接受数据到data数组*/        while(J1939_TP_RX_Message(data,sizeof(data))==RC_SUCCESS)            J1939_Poll(5);        osDelay(10); //基本单位为10ms;        J1939_Poll(20);    }}

可以将thread_CANComm ()理解为 main(),这里使用的RTOS实时操作系统,CAN的初始化已在其他的线程里实现

CANPro对总线的实际数据监测图

这里写图片描述

小结

虽然J1939协议栈在数据链路层规定,TP一次性最大只能传输1785字节,可满足大多数的使用。但是我们可以在不破坏J1939协议栈的前提下,在应用层编写是可以达到更高的传输字节。比如说:
1784 * 254 或者 1783 * 65535 .

原创粉丝点击