4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt

上传人:数据九部 文档编号:10394031 上传时间:2021-05-14 格式:PPT 页数:11 大小:6.42MB
返回 下载 相关 举报
4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt_第1页
第1页 / 共11页
4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt_第2页
第2页 / 共11页
4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt_第3页
第3页 / 共11页
4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt_第4页
第4页 / 共11页
4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt》由会员分享,可在线阅读,更多相关《4.4 4.5 定制一个CAN-bus应用层协议及其驱动.ppt(11页珍藏版)》请在三一文库上搜索。

1、定制一个CAN应用层协议及其驱动,目 录,CAN应用层协议驱动函数,制定CAN应用层协议说明,CAN应用层协议结构定义,定制CAN应用层协议,本节制定一个简单的CAN应用层协议并实现其驱动,协议中只使用 了标准帧中的数据帧。协议定义如下:,SrcAddr:发送CAN报文节点的地址,DstAddr:接收CAN报文节点的地址,FunCode:功能码,指明一帧数据的作用,FunDataLen:功能参数长度变量,指示功能参数的字节个数,FunData: 功能参数数组,最多包含8个字节,目 录,CAN应用层协议驱动函数,制定CAN应用层协议说明,CAN应用层协议结构定义,CAN应用层协议结构体定义,根据

2、定制的CAN应用层协议,定义CanAppProtocolFrame_t联合数据 类型,如下:,typedef union CanFrame_t CanFrame; struct unsigned long SrcAddr:4; / 源地址 unsigned long DstAddr:4; / 目的地址 unsigned long FunCode:3; / 功能码 unsigned long resev:5; / 保留位 unsigned long resev1:8; / 保留位 unsigned long resev2:8; / 保留位 unsigned char FF; / 是否为扩展帧 u

3、nsigned char RTR; / 是否为远程帧 unsigned char FunCodeLen; / 功能参数长度 unsigned char FunCode8; / 功能参数数组 ProtocolFrame; CanAppProtocolFrame_t;,由于联合体成员是共享内存的, 所以ProtocolFrame和 CanFrame_t 结构体实例的成 员之间存在对应关系。,CAN应用层协议结构体定义,ProtocolFrame结构体实例,以小端存储结构为例,ProtocolFrame结构体实例的成员与CanFrame-t 结构 体实例成员占用内存空间是一一对应的。,CanFram

4、e_t 结构体实例,resev1,resev2,FF,RTR,FunCodeLen,FunCode0,FunCode8,ID23:16,ID15:8,ID7:0,FF,RTR,DLC,Data0,Data 8,ID31:24,目 录,CAN应用层协议驱动函数,制定CAN应用层协议说明,CAN应用层协议结构定义,CAN报文处理函数定义,首先,CAN应用层协议驱动定义一个函数指针类型,在CAN帧处理 函数中调用该类型的回调函数识别功能码和功能参数。,CAN报文处理函数,功能码,功能参数,函数功能:处理接收到的CAN帧,本地地址,指向接收到的 CAN帧的指针,具体处理CAN帧 的回调函数指针,返回值

5、:1报文处理成功; 0报文处理过程中出错。,CAN报文处理函数,CAN帧处理函数具体如下:,Int CAN_CapFrameHandle(char LocalAddr, CanFrame_t *pCanFrame, CapHandle_PFUN callback) CanAppProtocolFrame_t *pCp = NULL; if(pCanFrame = NULL) return 0;/ 如果指针为空则返回失败 pCp = (CanAppProtocolFrame_t *)pCanFrame;/ 转化成指针类型 if (pCp-ProtocolFrame.FF != 0) return

6、 0;/ 不使用扩展帧 if (pCp-ProtocolFrame.RTR != 0) return 0;/ 不使用远程帧 if (pCp-ProtocolFrame.DstAddr != LocalAddr) return 0;/ 保证接收帧的地址等于 / 本地地址 if (callback != NULL) / 调用回调函数处理CAN帧 callback(pCp-ProtocolFrame.FunCode, pCp-ProtocolFrame.FunData0); return 1;/ 处理成功返回1 return 0; ,应用层CAN帧发送函数,应用层CAN帧发送函数定义如下:,函数功能

7、:应用层发送CAN帧,源地址:发送CAN帧的节点地址,目的地址:接收CAN帧的节点地址,功能码:表示CAN帧的具体作用,功能参数,功能参数的长度(以字节计数),返回值:1报文发送成功; 0报文发送失败。,应用层CAN帧发送函数,应用层CAN帧发送函数具体如下:,int CAN_CapFrameSend(char SrcAddr, char DstAddr, char cmd, char *pData, char len) CanAppProtocolFrame_t Cp; Cp.CanFrame.FF = 0;/ 设定成标准帧 Cp.CanFrame.RTR = 0;/ 设定成数据帧 Cp-P

8、rotocolFrame.SrcAddr = SrcAddr;/ 设定CAN帧源地址 Cp-ProtocolFrame.DstAddr = DstAddr;/ 设定CAN帧目的地址 Cp-ProtocolFrame.FunCode = cmd;/ 设置功能码 if (pData != NULL) if (len 8) return 0;/ 数据长度大于8个字节发送失败 memcpy(Cp.ProtocolFrame.FunData, pData, len);/ 复制数据到结构体缓冲区 Cp.ProtocolFrame.FunDataLen = len;/ 设定功能数据长度 return Hal_CanMsgSend(/ 发送CAN帧 ,虚拟驱动层CAN帧发送函数,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1