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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • SSM框架下,访问不到静态资源

    SSM框架下,访问不到静态资源记一次小问题。 做项目时,启动Tomcat,发现.jsp文件都能访问,但是同路径下的Html不能访问。服务器什么一切正常,没有任何错误信息。但就是最后返回视图的时候总是找不到资源。 经过仔细查找,发现原来在springmvc中,如果配置/拦截所有的请求,,那么在返回视图的.html url中一样会被拦截。但此时dispatcheservlet 拦截…

  • 如何修改手机IP地址

    如何修改手机IP地址说起手机换IP大家可能没有对电脑换IP那么熟悉,但是现在智能手机能做到事情越来越多,手机换IP也成为许多工作需要,一部分人还不知道怎么操作,就跟着小编一起来看看手机换IP的几种方法。一、手动换IP这个适合偶尔换IP,时间富裕的朋友,我们使用手机进行开关飞行模式,这样就可以进行换IP。也可以找到手机设置点进去先进入WiFi热点的列表,点击所连接的WiFi热点的名字。选择“修改网度络”,然后勾选“显示高级选项版”,就可以进行IP设置了。还有一种比较简单,就是用软件辅助换IP,这里以芝麻代理为例

  • java中jbpm工作流_java流程控制

    java中jbpm工作流_java流程控制1.        工作流       工作流是一项分离业务操作和系统流程的技术。工作流由实体(Entity)、参与者(Participant)、流程定义(FlowDefinition)、工作流引擎(Engine) 四部分组成。l  实体是工作流的主体,是需要随着工作流一起流动的物件(Object)。例如,在一个采购申请批准流程中,实体就是采购申请单;在公文审批流程中,实体就是公文。

  • JavaMD5[通俗易懂]

    JavaMD5[通俗易懂]publicclassCalPrivateKey{publicstaticvoidmain(String[]args) {StringappKey=”cee56d5722ea3afbef390e4dd1beda77″;StringappSecret=”010b02dd9b580f116c5352c5ecb7ca92″;St

  • 用Pyinstaller打包时遇到No module named win32timezone问题

    用Pyinstaller打包时遇到No module named win32timezone问题用Pyinstaller打包时遇到Nomodulenamedwin32timezone问题Pyinstaller使用方法我遇到的问题解决办法利用tkinter+python+pyinstaller实现了小工具的项目,没有pyinstaller打包时程序没有问题,打包后运行.exe过程中会在控制台打印错误。Pyinstaller使用方法我们对Markdown编辑器进行了一些功能拓展与语法…

    2022年10月28日
  • 这三大经典Python面试题,最常被提问[通俗易懂]

    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要给大家介绍几种常用的内置函数,例如:生成器(Generator)、lambda()、filter()、reduce()、map()。

发表回复

您的电子邮箱地址不会被公开。

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