SAE J1939 协议源代码分析(一)-程序结构框架

文件组成概述

文件名功能备注
J1939.c协议源代码数据链路层,网络层实现
j1939.h协议源代码数据链路层,网络层实现
j1939_Config.h协议配置移植文件移植J1939,唯一改动文件

函数组成结构

函数大概分为4类:

1.内部函数,J1939内部使用的函数。函数如下:

文件名类型备注文件位置
CompareName()私有函数协议内部调用J1939.c
CopyName()私有函数协议内部调用J1939.c
SendOneMessage()私有函数协议内部调用J1939.c
J1939_AddressClaimHandling()私有函数协议内部调用J1939.c
J1939_RequestForAddressClaimHandling()私有函数协议内部调用J1939.c
J1939_TransmitMessages()私有函数协议内部调用J1939.c
J1939_ReceiveMessages()私有函数协议内部调用J1939.c

2.接口函数,J1939协议提供给用户使用的函数,函数如下:

文件名类型备注文件位置
J1939_Initialization()接口函数用户可调用的函数J1939.c
J1939_ISR()接口函数用户可调用的函数J1939.c
J1939_Poll()接口函数用户可调用的函数J1939.c
J1939_DequeueMessage()接口函数用户可调用的函数J1939.c
J1939_EnqueueMessage()接口函数用户可调用的函数J1939.c

3.J1939与CAN的驱动接口函数,用户移植函数(中断接受发送模式)

文件名类型备注文件位置
Port_CAN_Receive()与CAN的接口函数需要移植j1939_Config.h
J1939_CAN_Transmit()与CAN的接口函数需要移植j1939_Config.h
ChangeGroupIDofLMO()与CAN的接口函数需要移植j1939_Config.h
J1939_SetAddressFilter()与CAN的接口函数需要移植j1939_Config.h
J1939_CAN_Transmit()与CAN的接口函数需要移植j1939_Config.h
J1939_RXinterruptEnable()与CAN的接口函数需要移植j1939_Config.h
J1939_RXinterruptDisable()与CAN的接口函数需要移植j1939_Config.h
J1939_TXinterruptEnable()与CAN的接口函数需要移植j1939_Config.h
J1939_TXinterruptDisable()与CAN的接口函数需要移植j1939_Config.h

4.J1939与CAN的驱动接口函数,用户移植函数(轮询接受发送模式)

文件名类型备注文件位置
Port_CAN_Receive()与CAN的接口函数需要移植j1939_Config.h
J1939_CAN_Transmit()与CAN的接口函数需要移植j1939_Config.h
ChangeGroupIDofLMO()与CAN的接口函数需要移植j1939_Config.h
J1939_SetAddressFilter()与CAN的接口函数需要移植j1939_Config.h
J1939_CAN_Transmit()与CAN的接口函数需要移植j1939_Config.h

备注:轮询模式 和 中断模式 二选其一,在配置文件中。

变量及其声明框架

1.全局变量

// 私有的全局变量(用户最好不要调用,除非本协议用作总线的网络管理器)
extern unsigned char    CA_Name[J1939_DATA_LENGTH]; 
extern J1939_FLAG       J1939_Flags; 
extern J1939_MESSAGE    OneMessage;  
//用户可用的全局变量(如有多线程操作,请加互斥)
extern unsigned char    J1939_Address; 
extern unsigned char    RXQueueCount; //RX列队计数器

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7


2.联合结构体声明

两个结构体的使用和说明,将在后面单独说明:

union J1939_MESSAGE_UNION 
{ 
    struct   me 
    { 
        unsigned int    DataPage            : 1; 
        unsigned int    Res                 : 1; 
        unsigned int    Priority            : 3; 
        unsigned int    PDUFormat_Top       : 3;    // 这就需要前后处理。 

        unsigned char   PDUFormat;      
        unsigned char   PDUSpecific; 
        unsigned char   SourceAddress; 
        unsigned int    DataLength          : 4; 
        unsigned int    RTR                 : 4;  //这几位总是为0
        unsigned char   Data[J1939_DATA_LENGTH]; 
    }; 
    struct me Mxe;
    unsigned char       Array[J1939_MSG_LENGTH + J1939_DATA_LENGTH]; 
}; 

typedef union J1939_MESSAGE_UNION J1939_MESSAGE; 
union J1939_FLAGS_UNION 
{ 

struct 
{ 
    unsigned int    CannotClaimAddress              : 1; 
    unsigned int    WaitingForAddressClaimContention: 1; 
    unsigned int    GettingCommandedAddress         : 1; 
    unsigned int    GotFirstDataPacket              : 1; 
    unsigned int    ReceivedMessagesDropped         : 1; 
   }; 
  unsigned char     FlagVal; 
}; 
typedef union J1939_FLAGS_UNION J1939_FLAG; 

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

3.配置声明

//配置ECU默认的地址
#define J1939_STARTING_ADDRESS 128

//如果声明不为0,表示我们的ECU(电子控制单元)支持网络中申请的任意地址,(参考J1939的网络层)下面为,配置ECU的标识符,(参考J1939-81)和附录
#define J1939_ARBITRARY_ADDRESS 0x00
#define J1939_INDUSTRY_GROUP 0
#define J1939_VEHICLE_INSTANCE 0
#define J1939_CA_NAME7 (J1939_ARBITRARY_ADDRESS | (J1939_INDUSTRY_GROUP << 4) | J1939_VEHICLE_INSTANCE) 
#define J1939_VEHICLE_SYSTEM 0
#define J1939_CA_NAME6 (J1939_VEHICLE_SYSTEM << 1) 
#define J1939_FUNCTION 0
#define J1939_CA_NAME5 J1939_FUNCTION 
#define J1939_FUNCTION_INSTANCE 0
#define J1939_ECU_INSTANCE 0
#define J1939_CA_NAME4 ((J1939_FUNCTION_INSTANCE << 3) | J1939_ECU_INSTANCE) 
#define J1939_MANUFACTURER_CODE 0
#define J1939_IDENTITY_NUMBER 50
#define J1939_CA_NAME3 (J1939_MANUFACTURER_CODE >> 3) 
#define J1939_CA_NAME2 (((J1939_MANUFACTURER_CODE & 0x07) << 5) | (J1939_IDENTITY_NUMBER >> 16)) 
#define J1939_CA_NAME1 ((J1939_IDENTITY_NUMBER >> 8) & 0xFF) 
#define J1939_CA_NAME0 (J1939_IDENTITY_NUMBER & 0xFF) 

//是否使用接受协议(TP)(参考J1939-21)
#define J1939_ACCEPT_CMDADD J1939_FALSE
//设置接受列队的大小
#define J1939_RX_QUEUE_SIZE 3
//发送消息列队是否允许被新的消息覆盖
#define J1939_OVERWRITE_RX_QUEUE J1939_FALSE
//设置发送列队的大小
#define J1939_TX_QUEUE_SIZE 3
#define J1939_OVERWRITE_TX_QUEUE J1939_FALSE
//是否使用轮询模式,否则使用中断模式
#define J1939_POLL_ECAN J1939_TRUE
#define J1939_PRIORITIZED_INT J1939_TRUE    

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

4.J1939内部常用代码(与J1939有关的配置,用户不能改变)

//函数返回代码
#define RC_SUCCESS              0  //成功
#define RC_QUEUEEMPTY           1  //列队为空
#define RC_QUEUEFULL            1  //列队满
#define RC_CANNOTRECEIVE        2  //不能接收
#define RC_CANNOTTRANSMIT       2  //不能传输
#define RC_PARAMERROR           3  //参数错误

//内部常量
#define J1939_FALSE             0 
#define J1939_TRUE              1 

// J1939 默认的优先级(参考J1939文档)
#define J1939_CONTROL_PRIORITY          0x03 
#define J1939_INFO_PRIORITY             0x06 
#define J1939_PROPRIETARY_PRIORITY      0x06 
#define J1939_REQUEST_PRIORITY          0x06 
#define J1939_ACK_PRIORITY              0x06 
#define J1939_TP_CM_PRIORITY            0x07 
#define J1939_TP_DT_PRIORITY            0x07 

// J1939 定义的全局地址和空地址
#define J1939_GLOBAL_ADDRESS            255 
#define J1939_NULL_ADDRESS              254 

// 一些用于J1939请求和控制的PF(PUD格式)
#define J1939_PF_REQUEST2           201  //请求
#define J1939_PF_TRANSFER           202  //转移

#define J1939_PF_REQUEST            234  //请求,用提供握手机制
#define J1939_PF_ACKNOWLEDGMENT     232  //确认请求,用提供握手机制

#define J1939_ACK_CONTROL_BYTE          0    //代表确认
#define J1939_NACK_CONTROL_BYTE         1    //PNG不被支持。否定消息
#define J1939_ACCESS_DENIED_CONTROL_BYTE    2//拒绝访问,但是信息是被支持
#define J1939_CANNOT_RESPOND_CONTROL_BYTE   3//不能做出反应,有空能是接受的缓存不够 

#define J1939_PF_DT                     235     // 协议传输---数据传输
#define J1939_PF_TP_CM                  236     // 协议传输---链接管理

#define J1939_RTS_CONTROL_BYTE          16      // CM消息的请求发送控制字节
#define J1939_CTS_CONTROL_BYTE          17      // 清除发送控制字节的CM消息
#define J1939_EOMACK_CONTROL_BYTE       19      
#define J1939_BAM_CONTROL_BYTE          32      
#define J1939_CONNABORT_CONTROL_BYTE    255 // 连接中断控制字节 

//与J1939网络层有关的定义 
#define J1939_PGN2_REQ_ADDRESS_CLAIM        0x00 
#define J1939_PGN1_REQ_ADDRESS_CLAIM        0xEA   
#define J1939_PGN0_REQ_ADDRESS_CLAIM        0x00 

#define J1939_PGN2_COMMANDED_ADDRESS        0x00 
#define J1939_PGN1_COMMANDED_ADDRESS        0xFE    //命令地址消息 
#define J1939_PGN0_COMMANDED_ADDRESS        0xD8    

#define J1939_PF_ADDRESS_CLAIMED        238      
#define J1939_PF_CANNOT_CLAIM_ADDRESS   238         
#define J1939_PF_PROPRIETARY_A          239         //专用A
#define J1939_PF_PROPRIETARY_B          255         //专用B

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: SAE J1939-C协议栈代码是一套用于实现SAE J1939协议的软件代码库。SAE J1939协议是一种用于重型商用车辆和工程机械的通信协议,它定义了一种在车辆之间进行数据交换和通信的标准方法。 SAE J1939-C协议栈代码提供了实现SAE J1939协议所需的全部功能和特性。它可以用于开发车辆ECU(电子控制单元)的软件,使其能够与其他车辆上的ECU进行通信。这种通信可以包括车辆的状态信息,如发动机温度、车速、油压等。此外,协议栈代码还支持更复杂的功能,如控制车辆的操作,如制动系统、转向系统等。 SAE J1939-C协议栈代码可以用于不同的硬件平台和操作系统,包括32位和64位的处理器架构,嵌入式系统和PC平台。它是以C编程语言编写的,因此可以很容易地移植到不同的开发环境中。 在使用SAE J1939-C协议栈代码时,开发人员需要了解SAE J1939协议的相关知识,并根据实际应用的需求对代码进行配置和定制。然后,他们可以使用协议栈代码提供的API(应用程序接口)来发送和接收消息,实现与其他车辆上ECU的通信。 SAE J1939-C协议栈代码是一个强大而灵活的工具,可用于快速开发和部署SAE J1939协议兼容的应用程序。它有效地简化了开发过程,提高了开发效率,并确保了开发的软件具备与其他车辆兼容和互操作的能力。 ### 回答2: SAE J1939-C协议栈代码是用于支持SAE J1939标准的通信协议栈的一套源代码SAE J1939是一种用于商用车辆和重型车辆通信的协议标准,它定义了一种高效和可靠的数据通信方式,使得车辆中的各个控制单元能够相互通信并协调工作。 SAE J1939-C协议栈代码提供了实现SAE J1939协议的基本功能,包括消息传输、节点管理、网络管理等。这些功能的实现是通过一系列的代码模块和函数来完成的,开发人员可以根据需要进行定制和调整。 SAE J1939-C协议栈代码的主要作用是简化SAE J1939标准的实施过程,并提供一个标准化的接口,使得不同车辆控制单元之间的通信更加方便和可靠。通过使用这个协议栈代码,开发人员可以快速构建符合SAE J1939标准的应用程序,同时减少开发周期和开发成本。 SAE J1939-C协议栈代码的设计考虑了效率、稳定性和可扩展性,可以满足不同应用场景的需求。它提供了丰富的API和配置选项,使得开发人员可以根据具体需求进行定制和优化。 总之,SAE J1939-C协议栈代码是一套用于支持SAE J1939标准的通信协议栈的源代码,通过使用这个代码,开发人员可以快速构建符合SAE J1939标准的应用程序,并在商用车辆和重型车辆的通信中实现高效和可靠的数据传输。 ### 回答3: SAE J1939 C协议栈代码是一种用于创建和实现SAE J1939通信协议的软件代码。SAE J1939是一种用于重型商用车辆和柴油发动机之间的通信的协议。该协议定义了一系列数据通信规则,以便不同组件和子系统之间可以进行可靠的信息交换。 SAE J1939 C协议栈代码基于C语言编写,可以在支持C编程语言的硬件设备上运行。它提供了一系列函数和数据结构,以便开发人员可以轻松地构建和扩展SAE J1939协议的功能。这些代码的设计和实现考虑到了SAE J1939的特定要求和规范。 开发人员可以使用SAE J1939 C协议栈代码来实现SAE J1939协议在不同设备之间的通信。代码提供了发送和接收信息的功能,包括定义和解析J1939报文、识别和管理J1939标识符以及设备的状态管理。使用这些代码可以实现可靠的数据通信和互操作性。 SAE J1939 C协议栈代码的优势在于它的可移植性和可扩展性。它可以在不同的硬件平台和操作系统上运行,并且可以根据特定的项目需求进行定制。此外,有许多开源和商业的SAE J1939 C协议栈代码可用,可以加快开发和测试过程。 总之,SAE J1939 C协议栈代码是一种用于实现SAE J1939通信协议的软件代码,它提供了一套功能丰富的函数和数据结构,用于构建和扩展SAE J1939协议的功能。它的可移植性和可扩展性使得它成为开发SAE J1939通信的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值