接收上位机的流程
1…Diagnostic_RxFrame()将这个函数置于CAN 接收中断中去,用于接收上位机消息的第一步
然后接着运行NetworkLayer_RxFrame()这个函数(这个函数是在Diagnostic_RxFrame函数中)
2…在上面那个函数中判断只接收ID正确的报文,并将接收到的数据复制到全局变量RxFrameBuff[]这个数组中去,并且将RxInIndex这个函数置位标志位,表示成功接收到了一组数据(can报文)
然后在NetworkLayer_RxProc()这个函数中判断接收的can报文属于哪种类型(单帧,首帧,连续帧,流控帧)
IsRxBuffEmpty()这个函数就是判断是否接收到数据并是否处理,如果,没有处理,就进入上面那个接收函数处理,处理了就不进入。
对于ECU接收上位机的各种帧数据
1…先接收单帧NetworkLayer_RxSF(),对于接收的所有帧我们在诊断初始化Diagnostic_Init_Config()这个初始化函数里面配置为半双工
因此接收的各种帧都只接受下面半双工的接收数据
数据就是在下面这个函数中赋值的
而对于这个判断条件的函数IsIndicationListFull(),一直会是等于0,return (IndicationInIndex == (MAX_INDICATION_NUMBER - 1) && IndicationOutIndex == 0) || (IndicationOutIndex == IndicationInIndex+1);因为这个函数IsIndicationListFull()中的返回值永远不满足,IndicationOutIndex这个值是在每一次数据传输到应用层之后的数据处理了之后改变,在主循环的这个函数Diagnostic_MainProc()
中的temp = PullIndication();这个函数中改变了他的值
2…下面是接收首帧介绍
首帧接收是通过这个函数接收的
网络层状态依旧是空闲,接收首帧后,将网络层状态置为接收m_NetworkStatus = NWL_RECIVING;
然后设置FS流控帧状态为等待发送(CTS),
然后在首帧指示函数N_USData_FF_indication()里面,将接收到的首帧数据上传到应用层,并置标志位,然后在数据指示这个函数N_USData_indication()这个函数中
记录总的数据长度,用在连续帧中
其中的NetworkLayer_RxStart()这个函数中将网络层撞他设置为接收,,等待流控请求,并将已完成的数据个数和已完成的块个数置0, RxParam.CompletedDataNumber = 0;
RxParam.CompletedNumberInBlock = 0;这几个参数的设置是为了接下来接收连续帧做准备。
3…下面介绍接收连续帧
因为此时的网络层状态已经在上面接收单帧的时候设置过了,是接收状态,因此进入接收,连续帧的接收就是个循环接收一次8个字节。
然后也是在指示函数里面将数据上传到应用层
NetworkLayer_RxEnd()最后再在这个函数中将所有的标志位值0,网络层状态也设置为空闲。
4…最后介绍流控帧的接收
通过上面这个函数设置
接收到流控帧之后不需要上传到应用层,,根据上位机接收到的上位机流控命令,只需要在网络层置相应标志位,然后发送连续帧即可。
上面并不是按照程序运行的流程来的,只是单纯的介绍了ECU接收各种帧的流程函数。
对于从ECU往上位机传输数据
一切的起点始于这个函数Diagnostic_MainProc(),这个函数是用在诊断应用层的最最最主要的函数,他是用于处理上位机的发送的各种服务的函数
分为两大部分,这个temp.NotificationType == INDICATION标志位的时候表示上位机发送过来的数据接收到了,然后重新判断ID是否正确,并将向应用层发送数据canID赋值
然后进入下面的服务函数
在Diagnostic_ServiceHandle()函数中的上面哪个图中判断服务是否支持(
然后分功能地址和物理地址接收,因为诊断初始化里面设置的是接收功能地址因此只运行功能地址的部分
完整程序请私聊了解