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

SAE J1939 协议源代码分析(一)-程序结构框架文件组成概述文件名功能备注J1939.c协议源代码数据链路层,网络层实现j1939.h协议源代码数据链路层,网络层实现j1939_Config.h协议配置移植文件移植J1939,唯一改动文件函数组成结构函数大概分为4类:1.内部函数,J1939内部使用的函数。函数如下:文件名类型备注文件位置Compa

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

文件组成概述

文件名 功能 备注
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列队计数器

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; 

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    

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

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

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

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


相关推荐

  • GraphQL学习

    GraphQL学习

    2021年6月14日
    162
  • 博客园整改之思考_整改思路

    博客园整改之思考_整改思路在博客园写博客写了三年半的时间了,当初为什么会选择在博客园写,我也记不清是什么原因了,或许这大概是缘分吧。今年3月份后半段的时候,博客园突然访问不了了,如今通过搜索资料,仍然发现有部分文章访问不了,

    2022年8月4日
    4
  • Hadoop集群配置(最全面总结)

    Hadoop集群配置(最全面总结)Hadoop 集群配置 最全面总结 nbsp nbsp huangguisu nbsp nbsp nbsp nbsp nbsp nbsp 通常 集群里的一台机器被指定为 nbsp NameNode 另一台不同的机器被指定为 JobTracker 这些机器是 masters 余下的机器即作为 DataNode 也作为 TaskTracker 这些机器是 slaves 官方地址 http hadoop apache org common docs r0 19 2 cn cl

    2025年8月1日
    5
  • python标识符命名规则和要求_python必背入门代码

    python标识符命名规则和要求_python必背入门代码python标识符命名规则什么是标识符标识符:现阶段学习的变量名,后期会学习的函数名,类名这些都是标识符.简单来说就是程序中所有的名字的总称就是标识符.标识符的名字是不能乱起的,就像手机号不能用110是一个道理标识符命名规则有如下4个要求:1.见名知意:看到变量的名字就能知道这个变量干什么的2.由字母、下划线和数字组成,且数字不能开头3.区分大小写4.不能和关键字重复什么是关键字关键字是python语言已经使用的标识符,所以不允许开发者自己定义和关键字相同的名字的标识符.

    2025年10月15日
    1
  • SQL server 2008 r2 安装图文详解

    文末有官网下载地址、百度网盘下载地址和产品序列号以及密钥,中间需要用到密钥和序列号的可以到文末找选择网盘下载的下载解压后是镜像文件,还需要解压一次直接右键点击解如图所示选项,官网下载安装包的可以跳过前两步等待解压完,过程可能会比较慢解压完后双击如图所示选项安装SQLServer2008R2需要.NETFramework3.5SP1支持这

    2022年4月8日
    50
  • docker(10)上传本地镜像到镜像仓库「建议收藏」

    docker(10)上传本地镜像到镜像仓库「建议收藏」前言之前通过docker搭建过jenkins+python3环境,如果想要在不同的机器上搭建一样的环境,就可以将之前搭建的镜像上传到镜像仓库,这样方便在不同的机器上快速搭建同一套环境。如果公开的话

    2022年8月6日
    7

发表回复

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

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