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列队计数器
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; //这几位总是为0unsigned 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
SAE J1939 协议源代码分析(一)-程序结构框架相关推荐
- ABAP报表程序结构框架
按金圣俊书中12章所写,ABAP报表程序结构如下,当选择屏幕出现时,系统会自动创建1000的屏幕,所以报表程序会很简单,选择屏幕完成后,再出现ALV控件,这样就接上了,不用去写屏幕相关的代码. *&a ...
- aodv协议源代码分析
转自:http://www.netforum.com.cn/forum_posts.asp?TID=9403 ns里实现的aodv是单播的,多播的aodv叫MAODV,网上有源代码.我觉 ...
- linux进程源码分析,Linux内核源代码分析——口述程序猿如何意淫进程(一)
Jack:hi,淫龙,有空吗?我们来讨论一下Linux的进程吧. 我:没空.不要烦我,最近正在郁闷. Jack:郁闷啥呀? 我:最近大学城通了轻轨,房价涨得厉害,骂了隔壁. Jack:不要郁闷了,来研 ...
- python程序结构框架_Python——Flask框架——程序的基本结构
一.安装 pip install flask 二.初始化 from flask importFlask app= Flash(__name__) 三.路由:处理URL和函数之间的关系的程序称为路由 ( ...
- 788_AUTOSAR_RS_SystemTemplate3_通信2_时序以及SAE J1939等
全部学习汇总: GitHub - GreyZhang/hack_autosar: learning autosar documents, aha, very hard! 继续学习AUTOSAR的文档, ...
- AUTOSAR协议解析篇(一)-J1939协议解析
SAE J1939协议是基于CAN2.0B协议之上的应用层协议,但是SAE J1939协议并不仅仅是个应用层协议,她对物理层,数据链路层,网络层,应用层,故障诊断, 网络层管理层等都做了详细的规定,只 ...
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议)
BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议) 发信人: wolfenstein (NeverSayNever), 个人文集 标 题: BT源代码学习心得(十三):客 ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...
- Android应用程序进程启动过程的源代码分析(1)
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实 ...
最新文章
- 【周末阅读】2019自动驾驶十大关键词
- Node.js建站笔记-使用react和react-router取代Backbone
- 并发编程:原子性问题,可见性问题,有序性问题。
- 并发编程知识点一张图总结
- 如何高效学Python?好用的爬虫工具又有哪些?
- VC批量拷贝,移动,删除文件---SHFileOperation
- Android内部存储与外部存储解析
- 集算器协助Java处理结构化文本之条件过滤
- 《Python Cookbook 3rd》笔记(4.15):顺序迭代合并后的排序迭代对象
- kvm架构详解--理解CPU、内存、IO虚拟化技术、处理器硬件支持
- 用yacc编写的算术运算计算器_10天学会四则运算小计算器设计之第5天
- 魔鬼一样的二分查找模板
- [UWP]了解模板化控件(8):ItemsControl
- 项目管理的十个经典法则
- linux打开db文件,我如何打开. db 文件?
- Cisco 交换机的操作
- 启发式查询树优化实例
- 微信小程序开发(六)——服务器
- Metric评价指标-Embedding Similarity
- java定义一个方法计算三角形,长方形,圆形面积和周长
热门文章
- pytorch——MINST数据集
- ztree 自定义参数_jQuery Ztree基本用法
- Google PAI资料整理及实现
- 【原创】ESXI获取虚拟机的moid,并使用VMRC登录远程虚拟机
- python内存注入代码,python语言编写的DLL注入工具
- 学习模式上的记录之统计篇四 关于excel里添加趋势线和回归统计的R square数值不一致的情况
- 提取swf素材_swf素材提取工具
- 如何在html中加入音效,JavaScript / HTML5中的音效
- 桂林理工大学计算机院导师信息,2018年新增硕士研究生指导教师名单公示
- 3Dmax和SketchUp有什么区别