其实之前文章也有介绍过:
简单回顾下CAN报文的接收过程:
BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;CAN Driver模块的Can_MainFunction_Read函数将访问CAN控制器的寄存器,比如仲裁寄存器,数据寄存器和数据长度寄存器等,并读取其数据; 数据读取结束后调用CAN Interface模块的CanIf_RxIndication函数,将数据从CAN Driver模块传给了上一层的CAN Interface模块,CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存。 应用层软件/模型通过RTE接口获取Com模块缓存的数据。
个人认为本质上是三个关键变量:报文ID, 报文数据长度和报文数据。大致如下的数据形式体现:
source: https://blog.csdn.net/bruce_qee/article/details/118740124
从图来看,数据形式并不简单,但我们可以简单化,从PDU来了解。
在AUTOSAR中,用PDU(Protocol Data Unit)、SDU(Service Data Unit)和PCI(Protocol Control Information)来描述不同层次之间的数据交换机制。
source: AUTOSAR Layer
PDU根据ISO的分层又有明确的称谓,在数据链路层传递的PDU为L-PDU,在网络层传递的PDU为N-PDU,在交互层传递的PDU为I-PDU。基于AUTOSAR架构,CAN通讯相关的PDU如下所示:
假设你托朋友在国外买了几罐奶粉,然后你朋友去DHL邮寄,邮寄地址为:中国上海嘉xx路xx弄 某某 手机号18888888888。由于DHL到国内转EMS,那么DHL打印贴包裹的快递单信息:
在了解了PDU、SDU和PCI的概念,以及L-PDU,I-PDU和N-PDU之后,我们再回归到CAN报文接收的数据。
3 CAN报文的PDU
了解PDU的概念之后,对应到CAN报文,其实可以这样来理解,PCI主要包括CAN数据帧的仲裁段和部分控制段,对应着CAN ID,而SDU主要包括部分的控制段和数据段,对应着CAN报文的长度和数据,如下所示:
对于每增加一条CAN接收或发送的报文,需要在不同的模块增加相应的配置,分别要在COM、PDUR、CANIF、CAN层添加报文相关内容如下示意:
所以理解好PDU的概念,将会很有利于理解CAN报文数据是如何从CAN驱动层传输到应用层软件/模型。
4 小结
创作不易,欢迎点赞再看收藏关注!
汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。