SAE J1939 协议源代码分析(六)-J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr)
来源:互联网 发布:罗永浩 支那 知乎 编辑:程序博客网 时间:2024/06/05 07:29
预备知识
1.熟悉CAN2.0B协议,及相关硬件驱动开发
2.熟悉SAE J1939协议http://blog.csdn.net/xietongxueflyme/article/details/74276702/
函数名
函数功能
基于SAE J1939协议,将发送消息MsgPtr加载到CAN驱动自带的结构体中,然后发送调用CAN驱动的发送函数,发送消息。
函数参数
配合移植函数ChangeGroupIDofLMO(),确定传入ChangeGroupIDofLMO()参数。
void J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr){ /*加载29位ID*/ ChangeGroupIDofLMO(can驱动的结构体,MsgPtr); /*加载数据长度*/ ; /*加载数据*/ ; /*加载RTR*/ ; /*开始发送数据,调用CAN驱动的发送函数*/ ;}
J1939_MESSAGE *MsgPtr 为要传入的参数,J1939_MESSAGE 消息结构体在J1939.h中,按J1939的收发格式做的。
#define J1939_MSG_LENGTH 5 //消息长度#define J1939_DATA_LENGTH 8 //数据长度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; unsigned char Data[J1939_DATA_LENGTH]; }; struct me Mxe; unsigned char Array[J1939_MSG_LENGTH + J1939_DATA_LENGTH]; };
传入ChangeGroupIDofLMO()参数根据你的设计方案。
这里我们默认方法,先配置结构体,再将结构体,写入CAN控制器(如果你写的CAN驱动,也支持这样的拓扑)。
移植示例
采用英飞凌XMC4500,对can驱动层,提取了CAN结构体,CAN_NODE3_DEBUG.lmobj_ptr[1]。将J1939协议自带的结构体 J1939_MESSAGE 中的数据写入CAN的结构体中。
我们默认移植方案是:
1. CAN驱动存在结构体(有些喜欢用很多全局变量),将与CAN有关的数据统一。
2. CAN驱动方式为,先写驱动结构体,在调用相应的函数将结构体中的数据配置CAN。
/**输入: J1939_MESSAGE *MsgPtr ,协议要发送的消息,*输出: *说明:从MsgPtr加载到CAN驱动自带的结构体中 将和ChangeGroupIDofLMO()联合移植(可不这样设计) 先将传入函数的MsgPtr中的数据写到CAN的结构体(加载),调用CAN驱动的发送函数*/void J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr){ CAN_NODE_LMO_t *lmo_ptr = CAN_NODE3_DEBUG.lmobj_ptr[1]; /*加载29位ID*/ ChangeGroupIDofLMO((const CAN_NODE_LMO_t * const)(CAN_NODE3_DEBUG.lmobj_ptr[1]),MsgPtr); /*加载数据长度*/ lmo_ptr->mo_ptr->can_data_length = MsgPtr->Mxe.DataLength; CAN_NODE_MO_Init(lmo_ptr); /*加载数据*/ lmo_ptr->mo_ptr->can_data_byte[0] = MsgPtr->Mxe.Data[0]; lmo_ptr->mo_ptr->can_data_byte[1] = MsgPtr->Mxe.Data[1]; lmo_ptr->mo_ptr->can_data_byte[2] = MsgPtr->Mxe.Data[2]; lmo_ptr->mo_ptr->can_data_byte[3] = MsgPtr->Mxe.Data[3]; lmo_ptr->mo_ptr->can_data_byte[4] = MsgPtr->Mxe.Data[4]; lmo_ptr->mo_ptr->can_data_byte[5] = MsgPtr->Mxe.Data[5]; lmo_ptr->mo_ptr->can_data_byte[6] = MsgPtr->Mxe.Data[6]; lmo_ptr->mo_ptr->can_data_byte[7] = MsgPtr->Mxe.Data[7]; /*加载RTR*/ //我的CAN驱动中默认是0,1939-21协议要求也为零,所以不在配置 /*开始发送数据*/ (CAN_NODE_STATUS_t) CAN_NODE_MO_Transmit(lmo_ptr) ;}
程序说明
J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr)与ChangeGroupIDofLMO()配合移植,设计者根据自己的需求,可将两者融合,博主之所以分开,是为了以后做网络管理器。和故障诊断工程预留。
关于J1939_MESSAGE结构体,请参考:http://blog.csdn.net/xietongxueflyme/article/details/74908563
- SAE J1939 协议源代码分析(六)-J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr)
- SAE J1939 协议源代码分析(七)-J1939_CAN_Receive(J1939_MESSAGE *MsgPtr)
- SAE J1939 协议源代码分析(零)-源代码下载
- SAE J1939 协议源代码分析(三)-程序应用分析
- SAE J1939 协议源代码分析(一)-程序结构框架
- SAE J1939 协议源代码分析(二)-程序移植
- SAE J1939 协议源代码分析(五)-ChangeGroupIDofLMO()
- SAE J1939 协议源代码分析(四)-J1939_SetAddressFilter(unsigned char Ps_Address)
- SAE J1939 协议源代码分析(八)-4大中断使能与使能
- SAE J1939协议
- VC++中如何实现基于CAN的SAE J1939协议
- SAE J1939 协议入门前须知(一)
- SAE J1939介绍
- SAE J1939学习笔记(一)
- SAE J1939学习笔记(二)
- SAE J1939学习笔记(三)
- SAE J1939学习笔记(四)
- SAE J1939学习笔记(五)
- Nginx的负载均衡,如何让某段时间访问A机器
- 用onchange实时监听radio的函数
- 如何用微服务重构应用程序
- android studion 代码混淆模板
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
- SAE J1939 协议源代码分析(六)-J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr)
- blktrace结合btt分析IO性能
- codevs1160 蛇形矩阵
- POJ2251
- 小跟堆维护排序
- Java_基础—集合的遍历之集合转数组遍历
- docker pull images:Error response from daemon: Get https://registry-1.docker.io/v2/: Unauthorized
- java 10进制和16进制的相互转换
- Android随笔之——用shell脚本模拟用户按键、触摸操作